例题 CG-CTF
点进去是
阅读代码,ereg( ,)(正则表达式匹配)
strpos( ,)(寻找里面的字符)
第一个if()告诉我们如果不是输入1-9以内的数就执行 输出“必须输入数字才行”
然后else if 如果nctf 有#biubiubiu 输出flag
否则输出“骚年,继续努力吧啊”
第一个方法
因为 ereg( ) 和 strpos( ) 中如果时数组的话返回NULL
get请求传入nctf[]=#biubiubiu
IF ereg返回NULL!=False 不通过
else if(NULL!=False) 成立输出flag
第二个方法
利用%00截断
传入参数
?nctf=1%00%23biubiubiu
首先第一个数必须要是1-9之间,其次后面跟%00截断后面的内容,然后下一行读取里面的%23biubiubiu满足输出flag
因为#在url里面是特殊字符所以要用%23代替
关于%00截断
不读取后面的字符,详情观看博客
测试文件1.txt如下
<?php
echo 'fireXXX';
?>
php5.2.x版本解析1.php时,会将1.txt\000.jpg解释为1.txt
url截断漏洞
PHP的00截断是5.2.x版本的一个漏洞,当用户输入的url参数包含%00经过浏览器自动转码后截断后面字符。
例如url输入的文件名1.txt%00.jpg经过url转码后会变为1.txt\000.jpg,测试文件1.php如下
<?php
include "1.txt\000.jpg";
?>
测试文件1.txt如下
<?php
echo 'fireXXX';
?>
php5.2.x版本解析1.php时,会将1.txt\000.jpg解释为1.txt
网页端要求我们上传,jpg,gif,png后缀的文件,上传之后
要求上传php的这之后我们用到00截断,先抓包
在uploads/后加上1.php+
点击hex找到1.php+所对应的位置
‘+’对应的是2b,改成00阻断就好了。
然后再发送一遍
第二种方法和第一种同种原理 ,第一种是在url上使用