DVWA No [Comma] Sqli

mac2026-04-22  10

0x01 WooYun-2014-52248

输入',有waf 输入1 and 1=1和1 and 1=2回显均正常。 感觉还是字符型注入,于是输入1' #,页面正常显示 ,感觉不像是waf,挺像是把报错界面换成了这个no error report提示,继续尝试1' and 1=1 #和1' and 1=2#,确实页面有变化,存在字符型注入,但是没有报错信息,报错注入肯定是用不了。 然后以为完事的时候,1' and union select 1,database() #,又报错了,试了一圈没发现是什么原因,改用布尔的盲注。 到查库名的时候,又报错了1' and ascii(substr(database(),1,1))>0 #,一想,这不会是逗号被过滤了,换个写法,1' and ascii(substr(database() from 1 for 1))>0 #,成了,还真是逗号被过滤了。 于是回到之前联合查询的地方,毕竟盲注手工起来看麻烦了。使用1' union select * from (select 1)a join (select 2)b #成功绕过,这也是常用的一种用join绕过,被 过滤的方式。 直接拿信息了,搞定。

0x02 源码分析

<?php if(isset($_GET['Submit'])){ // Retrieve data $id = $_GET['id']; $ids = explode(',',trim($id)); $id = $ids[0]; $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; $result = mysql_query($getid) or die('No Error Report!' ); $num = mysql_numrows($result); $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } } ?>

使用explode()函数以,为分割转成数组,取了数组中的第一个参数作为ID。做完以后看WooYun的提示才发现,有一种更简单的方法,这种方法可以在有过滤掉注释符的使用,不使用ascii()函数,直接使用字符串进行比较来完成闭合,get!

最新回复(0)