文件上传:
low:没有做任何过滤直接上传即可。
medium:源码:
$uploaded_type == "image/jpeg" || $uploaded_type == "image/png"
这段源码可以看出来他对上传到content-type值做了过滤,
只允许上传这两种type的值,但是没有过滤扩展名。
上传php文件修改content-type值或者传图片马修改扩展名即可。
high:源码:
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Is it an image?
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) )
白名单写死了绕不过去,有两种办法,可以结合文件包含和代码执行绕过。
文件包含:
1)
2)high文件上传shell.png
3)文件包含file协议包含
4)蚁剑连接
但是蚁剑链接出现了{}错误,浏览网站发现蚁剑访问awvs时没有登录自然也访问不了文件包含的页面了,那就无法执行文件包含的动作。
我们蚁剑内右键浏览网站登录上去后把cookie设置为high(默认为impossible)再执行发现成功拿到shell。
文件包含
low:没有对包含文件处做任何过滤直接利用即可
medium:源码:
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
对page的http和https做了替换,大小写即可绕过。
high:检查$file字符串是否为file开头
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" )
这里可以用到file协议去读取本地文件。file协议只能用于访问本地计算机中的文件。所以文件包含的利用往往伴随着文件上传。
文件上传那用的就是high级别的包含。可以爬一下小楼上去看一眼。