XCTF两个PHP代码审计的笔记
题目源码如下,考点是输入的$id和$row['id']的区别
关键在于红框内,可以知道题目的payload是要让$row['id']存在,查询的到数据,并且要让POST的id不能与adog相同。那显而易见,肯定是要你输入的id!==adog,并且需要绕过$row['id']的限制。
从P牛blog里,学到的一手姿势。自己用mysql FUZZ测试下,从这里可以查看$row['id']和$id的区别
<?php
mysql_connect("localhost","root","root");
mysql_select_db ("test");
mysql_query("set names utf8");
for($i = 0 ; $i < 256 ; $i++){
$c = chr($i);
$name = mysql_real_escape_string('hehe' . $c);
$sql = "SELECT * FROM `people` WHERE `name` = '{$name}'";
$result=mysql_query($sql);$row = mysql_fetch_array($result);
if ($row['name'] == 'hehe') {
echo "{$c} <br/>";
}
}
# P牛 bloghttps://www.leavesongs.com/PENETRATION/Mini-XCTF-Writeup.html
?>
#如果在name后面加上一个字符,在mysql里查询,如果查到的和不加这个字符查出来的行相同,则输出。
我在数据表中插入了这些数据
也就是说输入的id是adog ,但是在mysql_fetch_array(mysql_query($sql)),查询并且关联数组后,数组内键值为id的数组值仍为adog,所以$row['id']存在,因此绕过了$id==adog,并且还使$row['id']值存在.
那个fuzz已经充分的证明了。