01攻防世界ics-06
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=4920&page=1
这题 表面特别吓人
实际上可以进入报表中心
进入报表中心后 仔细观察url发现有个参数
思考了半天查了题解(丢人)
这题的做法是 直接爆破url(非常灵异 没啥技术可言)
用python代码弄出1-1w的数字
然后粘到爆破模块里开始爆破
排序一下长度发现有一个不是1866的 那个id就是有问题的
直接向url输入对应的id值即可拿到flag
02 种族歧视
分值: 300
小明同学今天访问了一个网站,竟然不允许中国人访问!太坑了,于是小明同学决心一定要进去一探究竟!
http://lab1.xseclab.com/base1_0ef337f3afbe42d5619d7a36c19c20ab/index.php
抓个包改一下语言(我直接改成哑巴(神秘)) 被当成外国人 就能拿到flag了
(其实我发现瞎填假装自己是外星人也可
)
03 key究竟在哪里呢?
分值: 200
上一次小明同学轻松找到了key,感觉这么简单的题目多无聊,于是有了找key的加强版,那么key这次会藏在哪里呢?
抓包 然后重发 在响应里发现了key
http://lab1.xseclab.com/base7_eb68bd2f0d762faf70c89799b3c1cc52/index.php
04 key又找不到了
分值: 350
小明这次可真找不到key去哪里了,你能帮他找到key吗?
http://lab1.xseclab.com/base8_0abd63aa54bef0464289d6a42465f354/index.php
点击超链接跳转到没有key的界面抓包
重发后得到提示 根据提示修改url拿到key
05 冒充登陆用户
分值: 200
小明来到一个网站,还是想要key,但是却怎么逗登陆不了,你能帮他登陆吗?
http://lab1.xseclab.com/base9_ab629d778e3a29540dfd60f2e548a5eb/index.php
这题抓包 把cookie的login改成1发送即可
06 Bugku 网站被黑
http://123.206.87.240:8002/webshell/
先用御剑扫描后台 发现可以进shell.php
进入后发现需要输入密码
然后用burp用默认字典爆破密码 成功黑入√
实战中常用 但其实没技术含量
07 Bugku flag在index里
http://123.206.87.240:8005/post/
点进去超链接
注意到url地址 http://120.24.86.145:8005/post/index.php?file=show.php
这是一个典型的文件包含漏洞 file关键字是提示
ip+/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
然后得到的字符base64解码即可
下面解释一下
php://是一种协议名称
php://filter/是一种访问本地文件的协议
/read=convert.base64-encode/表示读取的方式是base64编码
resource=index.php表示目标文件为index.php
通过传递这个参数可以得到index.php的源码
原理就是
源码中有include函数
表示从外部引入php文件并执行 如果执行不成功 就返回文件的源码
而include的内容是由用户控制的 所以通过我们传递的file参数 include()函数会引入了index.php的base64编码格式
因为是base64编码格式 函数看不懂base64乱七八糟的东西
所以执行不成功 返回源码
所以我们得到了源码的base64格式 解码即可
如果不进行base64编码传入 就会直接执行 得不到源码
08 Bugku 头等舱
http://123.206.87.240:9009/hd.php
乍一看确实啥也没有
传统艺能抓个包 重发 结果发现响应里有flag(类似的题似乎做过)
水题
09 Bugku 管理员系统
http://123.206.31.85:1003/
这题 抓个包 发现本机ip不让访问
输入用户名为admin
密码输入为源码底部base64解码的密码
联想到攻防世界说可以伪造XFF
我就直接伪造XFF为127.0.0.1 假装是本地
发包拿到flag
010 Bugku WEB4
http://123.206.87.240:8002/web4/
先查看源码
<html>
<title>BKCTF-WEB4</title>
<body>
<div style="display:none;"></div>
<form action="index.php" method="post" >
看看源代码?<br>
<br>
<script>
var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
</script>
<input type="input" name="flag" id="flag" />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
我发现 这些都可以hex解码
仔细观察后发现
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
这暗示字符串拼接 我可以用p1 中间那段 和p2拼接在一起
解码得到
function checkSubmit()
{var a=document.getElementById("password");if("undefined"!=typeof a)
{if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
return!0;alert("Error");a.focus();return!1}}
document.getElementById("levelQuest").onsubmit=checkSubmit;
提交67d709b2b54aa2aa648cf6e87a7114f1拿到flag
011 [HCTF 2018]WarmUp
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
代码审计
发现可以康康hint.php
进去康康发现提示
if (! empty($_REQUEST['file']) //$_REQUEST['file']值非空
&& is_string($_REQUEST['file']) //$_REQUEST['file']值为字符串
&& emmm::checkFile($_REQUEST['file']) //能够通过checkFile函数校验
) {
include $_REQUEST['file']; //包含$_REQUEST['file']文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
//打印滑稽表情
}
要满足三个条件
1.值为非空
2.值为字符串
3.能够通过checkFile()函数校验
再来看checkfile函数
public static function checkFile(&$page)//将传入的参数赋给$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//声明$whitelist(白名单)数组
if (! isset($page) || !is_string($page)) {//若$page变量不存在或非字符串
echo "you can't see it";//打印"you can't see it"
return false;//返回false
}
if (in_array($page, $whitelist)) {//若$page变量存在于$whitelist数组中
return true;//返回true
}
$_page = mb_substr(//该代码表示截取$page中'?'前部分,若无则截取整个$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);//url解码$page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
第四个if语句中
先进行url解码再截取
因此我们可以将?经过两次url编码
在服务器端提取参数时解码一次
checkFile函数中解码一次
(’?‘两次编码值为’%253f’)构造url:
经过各种审计(其实我没整明白 我只知道?会被解码两次 所以需要编码两次 变成%253以绕过判断 最后通过神奇目录穿透拿到答案)
source.php?file=source.php%253f…/…/…/…/…/ffffllllaaaagggg
012 [极客大挑战 2019]Havefun
我以为答案在注释里(想多了)
实际上 如果把dog传值给cat提交上去
会出现另一个答案()
这题 没啥说的
013 [极客大挑战 2019]Secret File
开幕雷击
查看源码发现提示 访问了一下那个archive的文件
点一下
啥也没有
点一下再抓包
发现了这个
直接访问不行
拿伪协议绕过 base64解码后 得到flag 并发现他想要女友(啧)
014 [ACTF2020 新生赛]Include
我DNA直接起反应了
当场一套伪协议操作 base64编码flag文件丢过去base64解码拿flag
015 [护网杯 2018]easy_tornado
这题我真的不会
查了也理解了半天
md5在线编码各种翻车 最后只好用py脚本跑了一遍
三个文件分别点开
目的很清晰
我们需要知道cookie那个文件还有filename 然后进行加密操作
现在filename已经知道了
cookie的话 就要搞模板注入了
msg={{handler.settings}}
dalao直接这样做了
这个叫ssti攻击 老实说我完全不懂 反正可以靠这个办法拿到cooke那个文件
加密后
给filehash传值 文件名写flllll那个名字
千万千万别在文件名后加.txt
我就是这样被卡到吐血
然后操作完就拿到flag了