声明
该系列共三篇,30个专题(截止2024.8.14),其中有26个专题的全部内容已于2023年8月在Freebuf发布,至此,这26个专题的安全客版本及相关专题的更新内容已全部重新编写并发布,旧版本文章可以不用看了,该专题为Freebuf首发。
本系列介绍
PortSwigger是信息安全从业者必备工具burpsuite的发行商,作为网络空间安全的领导者,他们为信息安全初学者提供了一个在线的网络安全学院(也称练兵场),在讲解相关漏洞的同时还配套了相关的在线靶场供初学者练习,本系列旨在以梨子这个初学者视角出发对学习该学院内容及靶场练习进行全程记录并为其他初学者提供学习参考,希望能对初学者们有所帮助。
梨子有话说
梨子也算是Web安全初学者,所以本系列文章中难免出现各种各样的低级错误,还请各位见谅,梨子创作本系列文章的初衷是觉得现在大部分的材料对漏洞原理的讲解都是模棱两可的,很多初学者看了很久依然是一知半解的,故希望本系列能够帮助初学者快速地掌握漏洞原理。
服务器端漏洞篇介绍
burp官方说他们建议初学者先看服务器漏洞篇,因为初学者只需要了解服务器端发生了什么就可以了
服务器端漏洞篇 - Nosql注入专题
众所周知,大部分的数据库都是关系型数据库,但是关系型数据库也有缺点,无法满足分布式存储的需求,所以Nosql数据库应运而生,它的设计目标是解决关系型数据库在可扩展性、性能和灵活性上的不足,NoSQL数据库不使用表和关系来存储数据,而是使用键-值对、文档、列族或图形数据模型来存储数据,它支持灵活的数据模式,不需要预定义表结构,可以存储不同结构的数据,它在处理大数据量、高并发读写请求时,通常具有比传统关系型数据库更高的性能,由于存储的类型不一样,所以查询语句也不像SQL语句那样通用:
-
文档存储 - 将数据存储在灵活的半结构化文档中。它们通常使用JSON、BSON和XML等格式,并使用API或查询语言进行查询。示例包括MongoDB和Couchbase。
-
键值存储 - 以键值格式存储数据。每个数据字段都与一个唯一的键字符串相关联。根据唯一键检索值。示例包括Redis和Amazon DynamoDB。
-
宽列存储 - 将相关数据组织到灵活的列族中,而不是传统的行中。示例包括Apache Cassandra和Apache HBase。
-
图形数据库 - 使用节点来存储数据实体,使用边来存储实体之间的关系。示例包括Neo4j和Amazon Neptune。
Nosql注入的类型
Nosql注入有两种类型:
-
语法注入 - 当可以破坏NoSQL查询语法,从而能够注入自己的payload时,就会发生这种情况。这种方法与SQL注入中使用的方法类似。但是攻击的性质差异很大,因为NoSQL数据库使用一系列查询语言、查询语法类型和不同的数据结构。
-
运算符注入 - 当可以使用NoSQL查询运算符来操作查询时,就会发生这种情况。
下面我们来分别讲一下这两种Nosql注入类型,主要以MongoDB为主。
Nosql语法注入
我们可以通过尝试破坏查询语法来检测NoSQL注入漏洞。我们应该测试每个输入,提交模糊字符串和特殊字符,如果应用程序未充分清理或过滤这些字符串和特殊字符,则会触发数据库错误或其他一些可检测的行为。如果我们知道目标数据库的API语言,要使用与该语言相关的特殊字符和模糊字符串。否则,使用各种模糊字符串来针对多种API语言。
探测MongoDB中的语法注入
试想有一个显示不同类别产品的购物应用程序。当用户选择碳酸饮料类别时,他们的浏览器会请求以下URL:
https://insecure-website.com/product/lookup?category=fizzy
这会引发一个JSON查询以从MongoDB数据库中获取对应的商品:
this.category == 'fizzy'
为了测试注入,我们可以插入一些模糊字符串:
'"`{
;$Foo}
$Foo \xYZ
然后写在URL里需要做一次URL编码:
https://insecure-website.com/product/lookup?category='%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
如果出现了异常响应,就说明后端并未进行正确的过滤,有时候我们还可以尝试使用这样的payload:
'\"`{\r;$Foo}\n$Foo \\xYZ\u0000
确定目标数据库使用哪些字符
我们第一步就是要先确定目标数据库将哪些字符解释为语法,和sql注入类似,我们先试一下单引号('):
this.category == '''
如果由此引发了异常响应,就说明这个字符破坏了原有的语法,然后为了验证这个猜想,我们可以尝试输入正确的字符:
this.category == '\''
如果并没有报错,说明确实可能存在Nosql语法注入。
确认条件行为
在确认了是否存在注入以后,我们就要思考下一步是不是能够利用Nosql语法影响其条件语句的布尔判断结果,为此,我们需要发两条请求,一条真' && 1 && 'x
,一条假' && 0 && 'x
,和常规sql注入类似:
真
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+1+%26%26+'x
假
https://insecure-website.com/product/lookup?category=fizzy'+%26%26+0+%26%26+'x
如果收到不同的响应,就说明是后端对错误的布尔条件做出了判断并影响了查询逻辑。
覆盖现有的条件
我们现在确定了我们可以注入语句来影响布尔判断,所以我们下一步要尝试覆盖现有的判断条件,我们可以注入结果永真的语句,如'||1||'
:
https://insecure-website.com/product/lookup?category=fizzy%27%7c%7c%31%7c%7c%27
在后端会看到这样的查询:
this.category == 'fizzy'||'1'=='1'
由于查询语句为永真,所以会返回所有的结果,包括隐藏商品等,但是在遇到添加或删除时使用永真的条件可能会导致数据意外丢失,这个需要注意一下。我们还能在后面加个空字符,这样会让空字符后面的限制条件失效,我们来看一下正常的带有限制条件的语句:
this.category == 'fizzy' && this.released == 1
上面的限制条件为仅显示发布的商品,当我们在输入后加个空字符:
https://insecure-website.com/product/lookup?category=fizzy'%00
到了后端处理就变成了:
this.category == 'fizzy'\u0000' && this.released == 1
这就取消了限制条件,就可以看到全部的商品了。
配套靶场:探测Nosql注入
这道靶场目标是利用Nosql语句注入列出所有的商品,我们打开以后随便点击一个筛选标签
这时候URL长这样:
/filter?category=Gifts
我们看到有个参数,我们尝试输入一些畸形字符串:
/filter?category=Gifts'%22%60%7b%0d%0a%3b%24Foo%7d%0d%0a%24Foo%20%5cxYZ%00
会发现有报错
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)