##例二、[%00截断]("http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php" "%00截断") (Strops函数以及ereg函数 )
if (isset ($_GET['nctf']))
{
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
这道题就是玩的代码分析,为了得到flag满足第二个条件语句
Php中的两个函数
ereg函数是一个正则匹配式存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。ereg函数可以用%00截断,这个是很常见的一种绕过方法
Strpos函数stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
注释:stripos() 函数是不区分大小写的。
payload
3、
<?phpif (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$",$_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}?>
GET方式提交password,然后用ereg()正则限制了password的形式,只能是一个或者多个数字、大小写字母,继续strlen()限制了长度小于8并且大小必须大于
9999999,继续strpos()对password进行匹配,必须含有-,最终才输出flag
因为ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。对于另一个难题可以使用科学计数法表示,计算器或电脑表达10的的
幂是一般是e,例如1.333e5=133300,所以构造1e8即1大于 9999999,再加上*-*。进行构造:
payload:password=1e8%00*-* 成功拿到flag
##例三、 [Intval函数]("http://chinalover.sinaapp.com/web11/robots.txt")
TIP:sql.php
<?php
if($_GET[id]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$id = intval($_GET[id]);
$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
if ($_GET[id]==1024)
{
echo "<p>no! try again</p>";
}
else{
echo($query[content]);
}
}
?>
这是一个sql.php文件
查看代码分析知道要想获得flag必须执行最后面的if语句的else语句得到文件内容传入的内容一定不能为1024
Intval()函数 获取变量的整数值,允许以使用特定的进制返回,默认10进制。
注:如果参数为整数,则不做任何处理。 所以get的id必须含有1024 那么就id=1024.x
payload:?id=1024.x 拿到flag
##例四、[php弱类型]("http://chinalover.sinaapp.com/web17/index.php")
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}
根据这些已知的信息我们可以发现这里的两个要求有一些矛盾,但是我们联想到这是一个使用php编写的脚本,而且在php中对数组的MD5加密之后都是NULL,所以可以使用这个小点来试试,对其进行修改加入构造的参数:
payload:http://chinalover.sinaapp.com/web17/index.php?a[]=x&b[]=y 这里的x、y 可以为任意数值!拿到flag