赞
踩
1,代码分析:
- <?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
- echo '<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
代码分析:
继续上传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
代码分析:
- <?php
-
- if( isset( $_POST[ 'Upload' ] ) ) {
- // Check Anti-CSRF token
- checkToken( $_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 {
- // No
- echo '<pre>Your image was not uploaded.</pre>';
- }
-
- // Delete any temp files
- if( file_exists( $temp_file ) )
- unlink( $temp_file );
- }
- else {
- // Invalid file
- echo '<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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。