当前位置: 代码迷 >> 综合 >> [favorite_number]writeup
  详细解决方案

[favorite_number]writeup

热度:69   发布时间:2023-12-03 00:09:35.0

考点:代码审计、正则表达式绕过、整型溢出

flag条件:1、使用post方式提交;2、需要强等于同时首元素不等;3、绕过正则表达式和黑名单

<?php
//php5.5.9
$stuff = $_POST["stuff"];//使用post方式提交
$array = ['admin', 'user'];//创建一个数组包含admin,user
if($stuff === $array && $stuff[0] != 'admin') {//既要stuff强等于array同时又要首元素不等,类型与数值相等,且stuff[0]不等于admin
    $num= $_POST["num"];
    if (preg_match("/^\d+$/im",$num)){//一个正则表达式,^和$分别匹配字符串开头和结尾,/d表示匹配数字,/i作用是不区分大小写,/m作用是修改^和$在正则表达式中的作用,让它们分别表示行首和行尾。
        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__);
}

利用php5.5.9整型溢出溢出漏洞,stuff[2^32]=stuff[0]

类型 占用字节数 取值范围
int 4 -2147483648~2147483647
short int 2 -32768~32767
long int 4 -2147483648~2147483647
unsign int 4 0~4294967295
unsigned short int 2 0~65535
unsigned short int 4 0~4294967295

数组key溢出,构造4294967296即为0

payload:stuff[4294967296]=admin&stuff[1]=user&num=2333

尝试绕过数字检测,使用换行符%0a绕过跨行匹配

注:这里不能使用hackbar,火狐会自动将换行符%0a前面加上回车符%0d,导致绕过失败,可以使用burpsuite抓包改包

使用ls /查看根目录

本来使用cat /flag即可获得flag,可惜cat和flag被拉入黑名单,尝试使用其他查看文件内容的方法,如:tec,less,more等等

方法一:使用less、tec获得flag

方法二:使用ls -i寻找flag的inode号

 

然后,读取flag