介绍:
自己懒得搭建靶场了,靶场地址是 GitHub - CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges为了方便在公网练习,可以随地访问,本文所有的题目均来源于网站HSCSEC-Code Audit
6、习题6
题目内容如下:
源代码如下:
<?php if (isset($_GET['view-source'])) { header('Location: http://challenge1.xa.honyasec.com/index.php'); show_source(__FILE__); exit(); }
if (isset($_POST["submit"]))
{ if (isset($_POST['hihi'])) { if (ereg("^[a-zA-Z0-9]+$", $_POST['hihi']) === FALSE) { exit('<script>alert("have fun:)")</script>'); } elseif (strlen($_POST['hihi']) < 11 && $_POST['hihi'] > 999999999) { if (strpos($_POST['hihi'], '#HONG#') !== FALSE) { if (!is_array($_POST['hihi'])) { include("flag.php"); echo "Congratulations! FLAG is : ".$flag; } else { exit('<script>alert("nonono")</script>'); } } else { exit('<script>alert("nonono")</script>'); } } else { exit('<script>alert("sorry")</script>'); } }
}
?>
<a href="?view-source">view-source</a>
代码分析:
通过代码分析,需要POST提交两个参数一个是submit 一个是hihi并且submit 在前,hihi在后。提交submit 的值无所谓,给一个值就好。
主要是hihi 参数,hihi参数的长度不能大于等于11,而且hihi的值要大于999999999 也就是最小是 1000000000 这样 hihi 的值的长度也就达到10了,所以用科学计数法绕过为 1e9,另外strpos()函数 需要拼接 #HONG# 也就是 1e9#HONG# 但是这样就不能算做数值大于999999999,前面正好有ereg("^[a-zA-Z0-9]+$", $_POST['hihi'] ,进行正则匹配。但是ereg() 可以用%00 截断绕过。 所以最后构造的paylaod 是
POST #形式提交数据
submit=1&hihi=1e9%00#HONG# #data
提交之后,拿到flag ,该网站没有成功,估计靶场没有搭建好,重要的是思路
7、习题7
题目内容如下
源代码如下:
<?php
include "flag.php";
$_403 = "Access Denied";
$_200 = "Welcome Admin";
if ($_SERVER["REQUEST_METHOD"] != "POST") die("BugsBunnyCTF is here :p...");
if ( !isset($_POST["flag"]) ) die($_403);
foreach ($_GET as $key => $value) $$key = $$value;
foreach ($_POST as $key => $value) $$key = $value;
if ( $_POST["flag"] !== $flag ) die($_403);
echo "This is your flag : ". $flag . "\n";
die($_200);
?>
分析代码后发现,如果要拿到flag 必须满足三个if 的条件,1、请求方法必须包含POST请求,2、并且必须提交必须有flag参数,3、POST提交的flag 的值要和$flag相等。
首先根本不知道$flag 的值是多少,但是后面有一个die($200);同时,含有foreach()函数可以进行变量覆盖,通过die($200)输出$flag 的值。
接着分析,发现了有两个foreach() 函数,所以在echo 函数输出的时候,输出的变量 $flag 是被覆盖过的。结合第一个foreach的功能,我们可以在第二个foreach之前先将$_200的值覆盖为原$flag的值,这样最后die($200)就会输出相当于die($flag)
变量覆盖漏洞解释:
通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞。
例如下面的例子
<?php $name='thinking'; foreach($_GET as $key=>$value) $$key = $value; var_dump($key);
var_dump($value);
var_dump($$key);
echo $name; ?>
如果给与参数?name=test 那么 $key=name $$key=test
最后输出如下
所以本题目,如果借助die($200)输入flag 需要将$flag的值赋值给 $200,同时需要POST 提交一个flag 的值
构造如下:
?$_200=flag
flag=1 #POST
flag{xiaodalsdhasuyytajds}
当然,也可以借助die($_403)输出flag
if ( $_POST["flag"] !== $flag ) die($_403);
构造如下
?_403=flag&_POST=1 # 利用第一个foreach函数将_403的值覆盖,同时构造满足$_POST["flag"] !== $flag将变量_POST给覆盖,从而初始化第二个foreach函数flag= #POST方式将$flag的值
flag{xiaodalsdhasuyytajds}