前言
Hi~ o( ̄▽ ̄)ブ,我是一名刚刚开始学习网安的新手。在做PortSwigger实验室(也就是BurpSuit官方做的靶场和学习中心)题目的时候发现对于新手来说还是有很多问题的。上网搜索相关文章发现可能是官方跟新了靶场的题目,导致很多文章已经“货不对板”了。思来想去最后决定自己来写一篇通关文章!如果有什么地方写的不好或者有什么错误欢迎大伙指出批评~~
ps:该文章包含大量我作为初学者在解题过程中的学习过程和内容,可能会显得很臃肿。如果只是寻找简洁的通关攻略的朋友可能就不太适合啦~~作为初学者很多地方可能写的不够详细或者有错误,希望大家能在评论区积极讨论嘻嘻(●’◡’●)
本篇主要是题解实践,立论放在我的另一篇笔记中,如果感兴趣也可以看看哦!SQL注入)
靶场地址
关于SQL注入
这个段落是对SQL的一些简介,如果您已经很了解了就可以直接跳过了哦~~(以下内容基于PortSwigger中对于SQL injection的讲解进行翻译和添加:靶场地址。)
什么是SQL注入
SQL注入(SQLi)是一种Web安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或者应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为发生持久更改。
在某些情况下,攻击者可以升级SQL注入攻击以危及底层服务器或其他后端基础架构,或执行拒绝服务攻击。
一次成功的SQL注入攻击会造成什么样的影响
成功的SQL注入攻击可能导致对敏感数据(如密码、信用卡详细信息或个人用户信息)的未经授权访问。近年来,许多备受瞩目的数据泄露都是SQL注入攻击的结果,导致声誉受损和监管罚款。在某些情况下,攻击者可以获得进入组织系统的持久后门,从而导致长期的危害,而这种危害可能会在很长一段时间内被忽视。
SQL injection 题解
Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data(实验:WHERE子句中的SQL注入漏洞允许检索隐藏数据)
目标
验证是否存在SQL漏洞,并通过执行SQL注入攻击,使应用程序显示一个或多个未发布的产品。
情报
产品类别筛选器中存在SQL注入漏洞。当用户选择一个类别时,应用程序执行如下所示的SQL查询:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
行动
访问实验室
可以看到是一个商店的主页,有提供按照类型检索的功能,点一下试试看:
按照上方情报我们已经知道其后方执行的SQL语句,因此直接构造payload:
'+OR+1=1--
可以预测其拼接后会执行的SQL语句是:
SELECT * FROM products WHERE category = ''+OR+1=1--' AND released = 1
“–”是注释的意思,在其后方的语句会被注释起来。因为1等于1永远是对的,因此无论category字段匹配与否都不会影响最终结果,该表会被全部显示出来
到这就成功啦!
恭喜你解开了第一道题!b( ̄▽ ̄)d
Lab: SQL injection vulnerability allowing login bypass(实验:允许绕过登录的SQL注入漏洞)
第一次做的时候还蛮震惊的,真的没想到还可以这样玩
目标
使用
administrator
用户的身份成功登录。
情报
实验中包含登陆函数中的SQL注入漏洞,可以利用此执行SQL注入攻击在没有密码的情况下实现登录指定用户。
行动
访问实验室
可以看到右上角“My account”,应该就是登录入口。
这里我们发现用户名和密码是通过POST方式提交上去的(可以使用bp抓包也可以使用浏览器插件),我们的目的是希望在没有密码的情况下能成功登录某特定账号。猜测其可能是通过直接将传输过去的
username
和
password
拼接进SQL语句,然后运行该语句来查询数据库中是否有匹配的用户名与密码作为登录是否成功的逻辑判断。根据这个逻辑设计payload:
administrator'--
如此只需要存在
administrator
用户名即可,后方关于密码的部分都会被注释掉。
成功进去啦!
这里有个有趣的地方,我们仔细比较这两个域名。
https://0ab600e50492aad082fb74b2003800a5.web-security-academy.net/my-account?id=administrator
https://0ab600e50492aad082fb74b2003800a5.web-security-academy.net/login
有没有一种可能我们使用GET请求带着ID直接去访问这个
/my-account
也能成功呢?
尝试使用
id=administrator
参数去访问也是可以通关的,不过被弹回了登录界面,看来还是有登录拦截器的。
Lab: SQL injection attack, querying the database type and version on Oracle(实验:SQL注入攻击,查询Oracle上的数据库类型和版本)
目标
获取数据库版本。
情报
UNION攻击
UNION 命令可以在原命令上追加一个或是多个 select 命令并将结果随原命令一同返回。
SELECT a,b FROM table1 UNION SELECT c,d FROM table2
原命令是对 table1 的查询,使用 UNION 之后可以在原命令的基础之上追加对 table2 的查询,并且将两个结果一同返回。
所以很明显,要使得 UNION 命令成功生效,我们需要注意两点,一是每个查询必须要返回数量相同的列,二是反馈结果中每列数据的数据结构类型应该是相互兼容的。
Oracle数据库
这关有些特殊在于它使用的是Oracle数据库。在Oracle数据库中每个
SELECT
语句都必须指定要选择的表,所以在使用
UNION SELECT
进行攻击时也是需要使用
FROM
来指定有效的表名。在Oracle中有一个名为
dual
的内置表,我们可以用它来作为一个有效表名来构建我们的payload。
想了解更多关于不同数据库细节上的不同可以看看PortSwigger提供的SQL injection cheat sheet:
https://portswigger.net/web-security/sql-injection/cheat-sheet
行动
访问实验室
可以猜测这次的漏洞点是和第一题一样的产品类别筛选器。要使用
UNION SELECT
来进行攻击,我们就需要知道原语句中返回的字段数。这时候我们就需要使用到
order by
语句。
order by
语句用于根据指定的列对结果集进行排序,通过更改
order by
后面的数字,可以找出查询结果中具有多少个字段。当输入的字段数超出实际的字段数时,网页将返回错误,因此这是个有效的猜测方法。使用
+order+by+x
,递增x值来使得服务器返回错误。即可确认其查询字段数为x-1。
可以看到这里我们使用3的时候出现了报错,也就是实际字段数应该是3-1也就是2。
按照得到的信息我们可以开始尝试
UNION
注入了,这里我们设计payload来验证能否进行
UNION
查询:
'+UNION+SELECT+NULL,NULL+FROM+dual--
可以正常返回!说明漏洞确实是存在的,接下来我们需要找到一个可以接受字符串的列。我们可以替换NULL的值来实现这一点。
'+UNION+SELECT+'a',NULL+FROM+dual--
'+UNION+SELECT+NULL,'a'+FROM+dual--
这些payload会尝试在每一个字段位置插入一个字符串,如果插入成功(没有产生错误,并且你在响应中看到了你插入的字符串),那么就找到了一个可以接受字符串的字段。一旦找到了能够接受字符串的字段位置,那事情就变得有趣起来了~~~/(^^)~~~
可以发现这里是两个的都可以的。
接下来我们就可以开始利用了。针对我们上面设计的payload进行一些改造以拿到我们想要的数据库版本信息。
'+UNION+SELECT+BANNER,+NULL+FROM+v$version--
成功拿下!!!
Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft(实验:SQL注入攻击,查询MySQL和Microsoft上的数据库类型和版本)
目标
和上题一样,依旧是获取数据库版本。
情报
这道题的数据库生产商不同了,需要注意针对性的构造payload。
以下是一些查询,用于确定某些常用数据库类型的数据库版本:
Database type 数据库类型Query 查询Microsoft, MySQL Microsoft、MySQLSELECT @@versionOracle 甲骨文SELECT * FROM v$versionPostgreSQLSELECT version()
url编码
应为在这关的payload设计中会用到一些特殊字符去构建payload,这其中就会涉及到url编码的问题。所以在这说明一下(因为我刚学的时候经常看大佬们的文章这地方都是一笔带过的,不明白为什么要做这一步)。
什么是url编码,URL 编码是一种将特殊字符以及非 ASCII 字符转换为特定格式的编码方式,以便在 URL 中安全传输和处理。URL 编码通常用于将包含非标准字符的字符串转换为符合 URL 规范的形式,以防止 URL 中的特殊字符干扰 URL 的结构和解析。
在 URL 编码中,每个字符被表示为 “%” 后跟两个十六进制数字。例如,空格字符被编码为 “%20”,而特殊字符如斜杠 (“/”) 被编码为 “%2F”。这有助于确保 URL 中的特殊字符不会被解析器误解为控制字符或其他用途。
行动
熟悉的主页,依旧是上面的套路。不过这次我们用bp,设置拦截后我们选一个产品类别“Gifts”后截获到了一个报文:
可以看到category就是我们需要修改的目标参数,我们尝试进行修改确定查询返回的列数以及哪些列包含文本数据(和上一题类似,这里就不赘述了),我们将截获的的报文发给Repeater模块 。
基于此我们设计payload:
'+UNION+SELECT+@@version,+NULL#
来获得我们需要的目标信息。
成功拿下!
https://portswigger.net/web-security/sql-injection/examining-the-database
暂时更到这里,最近忙学校课程腾不出手脚。
下次一定!!!٩(๑`^´๑)۶
版权归原作者 忆南平 所有, 如有侵权,请联系我们删除。