2021-02-03
文章目录
1. dvaw配置环境
列了一些出现的问题
1.1. 无法创建数据库
仔细看看readme
To set up the database, simply click on the Setup DVWA
button in the main menu, then click on the Create / Reset Database
button. This will create / reset the database for you with some data in.
If you receive an error while trying to create your database, make sure your database credentials are correct within ./config/config.inc.php
. This differs from config.inc.php.dist, which is an example file.
The variables are set to the following by default:
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = 'p@ssw0rd';
$_DVWA[ 'db_database' ] = 'dvwa';
Note, if you are using MariaDB rather than MySQL (MariaDB is default in Kali), then you can’t use the database root user, you must create a new database user. To do this, connect to the database as the root user then use the following commands:
mysql> create database dvwa;
Query OK, 1 row affected (0.00 sec)
mysql> create user dvwa@localhost identified by 'p@ssw0rd';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on dvwa.* to dvwa@localhost;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
简单的说,就是如果想要用mysql创建,不能使用最开始的root账号,需要新建一个
照着来就行了,所以最开始一定得看看Read Me
1.2. 登录
账号:admin
密码:password
1.3. File Inclusion
打开File Inclusion,发现红色报错内容
The PHP function allow_url_include is not enabled.(PHP函数allow_url_include未启用)。
找到php.ini,将
‘‘allow_url_include=Off’’ 改为 ‘‘allow_url_include=On’’
‘‘display_errors=Off’’ 改为 ‘‘display_errors=On’’
注意要区分大小写
1.4. Vulnerability: Insecure CAPTCHA
dvwa不能正常显示,需要在配置文件中加入谷歌的密钥:
$_DVWA[ 'recaptcha_public_key' ] = '6LfX8tQUAAAAAOqhpvS7-b4RQ_9GVQIh48dRMGsD';
$_DVWA[ 'recaptcha_private_key' ] = '6LfX8tQUAAAAAIR5ddYvRf3zNqM-k__Ux73oZzb_';
2.文件伤处啊不能(upload)
2.0.预备知识
- WebShell:webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。
- 一句话木马
<?php @eval($_GET['cmd'];) ?>
2.1.最简单的文件上传功能
upload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>UPLOAD</title>
</head>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
upload_file.php
<html>
<head>
<meta charset="utf-8">
<title>上传文件</title>
</head>
<body>
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
</body>
</html>
2.2. files的变量的用法
$_FILES超级全局变量很特殊,他是预定义超级全局数组中唯一的二维数组。其作用是存储各种与上传文件有关的信息,这些信息对于通过PHP脚本上传到服务器的文件至关重要。此函数中总共有5项:
1.$_FILES["userfile"]["error"]
提供了与上传尝试结果有关的重要信息。总共有5个不同的返回值,其中一个表示成功的结果,另外4个表示在尝试中出现的特殊错误。每个返回值的名字和将在后面介绍。
2.$_FILES["userfile"]["name"]
指定客户端机器上声明的文件最初的名字,包括扩展名。因此,如果浏览器一个名为vacation.jpg的文件,并通过表单上传,则此变量的值将是vacation.png。
3.$_FILES["userfile"]["size"]
指定从客户端上传的文件的大小,以字节为单位。因此,在vacation.jpg文件的例子中,此函数可能赋值为5253,大约为5kb.
4 . $_FILES["userfile"]["tmp_name"]
指定上传到服务器后为文件赋予的临时名。这是存储在临时目录(由PHP指令upload_tmp_dir指定)中时所指定的文件名。
5 . $_FILES["userfile"]["type"]
指定从客户端上传的文件的mime类型。因此,在vacation.jpg文件的例子中,此变量会赋值为image/jpeg。如果上传的是PDF,则赋值为application/pdf。因为这个变量有时会得到意外的结果,所以应当在脚本中显示地进行验证。
[‘error’] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
UPLOAD_ERR_OK
值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE
值:4; 没有文件被上传。
值:5; 上传文件大小为0.
2.3文件上传代码审计
2.3.2. low
直接传,真就啥都不管。
上传文件,直接保存,保存路径hackable/uploads/,文件上传成功后,返回successfully。
函数move_upload_file(string $filename, string $destination):将文件移动到指定位置。
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>
2.3.3.medium
代码分析
当有提交上传文件时,少量先用变量从$_POST[‘uploaded’]取出文件路径,文件名,文件类型,文件大小;然后对文件MIME类型进行判断,如果文件类型为image/jpeg或者和image/png文件大小小于100000byte,则将临时文件移动到指定目录,上传成功,则回显文件路径
这种防御措施主要是设置MIME类型白名单过滤规则,同时限制文件大小
如果不进行修改,则上传html文件类型会报错。
通过使用抓包工具Burp抓包,修改报文形式实现上传。
把报文拷贝到Intercept下的Raw中,修改Content-Type字段中的内容为image/png。
注:Content-Type是客户机设置的标准HTTP头文件,用于向服务器说明它接收的数据类型。很多开发人员通过判断content-type过滤危险文件。但是这种保护措施的脆弱的。拦截和修改请求包时web应用渗透测试的一个非常重要的技能。不仅可以绕过一些客户端验证,还可以研究发送的信息,并且尝试理解应用程序的内部工作方式。有时候,需要添加、删除或替换一些值。
单击【Forward】(放包),则发送成功,看到上传成功。
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>
3.杂记
3.1.burpsuite只拦截特定网站数据包
在配置burpsuite代理截包时经常会遇到这样的情况:
浏览器经常自己发一些包,干挠对目标网站的检测;
或者想要在过程中搜一些东西,还要禁用拦截。
启动burpsuite–切换到“Proxy”选项卡–选择“Options”菜单–往下看到“Intercept Client Requests”节区
点击添加,按照上图中And ,IP address,输入IP地址
再开启拦截,就只会拦截目标ip的数据包
另外注意上边只配置了Request,如果要配置Respone的过滤,要到再下边一点的“Intercept Server Respones”节区进行配置。
3.2. PHP basename() 函数
basename() 函数返回路径中的文件名部分。
例子
<?php
$path = "/testweb/home.php";
//显示带有文件扩展名的文件名
echo basename($path);
//显示不带有文件扩展名的文件名
echo basename($path,".php");
?>
输出
home.php
home