一、环境搭建

首先搭建Pikachu靶场环境。
https://github.com/zhuifengshaonianhanlu/pikachu 将下载好的pikachu文件夹放到phpstudy的web服务器根目录下,根据实际情况修改inc/config.inc.php里面的数据库连接设置,
访问pikachu网址,点击初始化安装,即可完成安装。

二、SQL注入代码审计

1、数字型SQL注入

BenchmarkJava 靶场通关_web安全


如图所示为SQL数字型注入页面,找到该网页源码。

下图为关键代码:

BenchmarkJava 靶场通关_BenchmarkJava 靶场通关_02


这里面的SQL语句前后无过滤和判断,使用burp抓包复现:

BenchmarkJava 靶场通关_上传_03


复现出这种即可证明存在该漏洞。

2、字符型SQL注入

查看源代码:

BenchmarkJava 靶场通关_上传_04


漏洞复现:

BenchmarkJava 靶场通关_数据库_05

3、http头注入

查看源码:

BenchmarkJava 靶场通关_web安全_06


漏洞复现

BenchmarkJava 靶场通关_上传_07

4、盲注

查看源码:

BenchmarkJava 靶场通关_web安全_08


漏洞复现:

payload:

kobe’%20and%20’1’=‘1

kobe’%20and%20’1’='2

BenchmarkJava 靶场通关_web安全_09

5、宽字节注入

查看源码:

BenchmarkJava 靶场通关_BenchmarkJava 靶场通关_10


漏洞复现:

BenchmarkJava 靶场通关_BenchmarkJava 靶场通关_11

三、XSS代码审计

1、反射型XSS

查看源码:

BenchmarkJava 靶场通关_BenchmarkJava 靶场通关_12


漏洞复现:

BenchmarkJava 靶场通关_安全_13


输入

BenchmarkJava 靶场通关_web安全_14

2、存储型XSS

查看源码:

BenchmarkJava 靶场通关_web安全_15


直接输出用户提交的数据 , 触发储存型XSS

BenchmarkJava 靶场通关_安全_16


漏洞复现:

BenchmarkJava 靶场通关_安全_17

四、文件上传

1、前端限制

BenchmarkJava 靶场通关_安全_18


BenchmarkJava 靶场通关_安全_19


BenchmarkJava 靶场通关_安全_20

2、服务端校验

代码分析:

BenchmarkJava 靶场通关_安全_21

具体函数定义

//只通过MIME类型验证了一下图片类型,其他的无验证,upsafe_upload_check.php
 function upload_sick(mime,$save_path){ $arr_errors=array(
 1=>‘上传的文件超过了 php.ini中 upload_max_filesize 选项限制的值’,
 2=>‘上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值’,
 3=>‘文件只有部分被上传’,
 4=>‘没有文件被上传’,
 6=>‘找不到临时文件夹’,
 7=>‘文件写入失败’
 );
 // _FILES[$key][‘error’])){ $return_data[‘error’]=‘请选择上传文件!’;
 $return_data[‘return’]=false;
 return KaTeX parse error: Expected 'EOF', got '}' at position 18: …turn_data; }̲ // 判断是否上传失…_FILES[$key][‘error’]!=0) {
arr_errors[key][‘error’]]; $return_data[‘return’]=false;
 return $return_data;
 }
 //验证一下MIME类型 $mime为白名单数组 , 判断如果不在白名单数组中
 //恰巧 _FILES[$key][‘type’], $mime)){ // 提示错误信息
 $return_data[‘error’]=‘上传的图片只能是jpg,jpeg,png格式的!’;
 // 返回 false
 $return_data[‘return’]=false;
 return KaTeX parse error: Expected 'EOF', got '}' at position 18: …turn_data; }̲ //新建一个保存文件…save_path)){
 if(!mkdir($save_path,0777,true)){
 $return_data[‘error’]=‘上传文件保存目录创建失败,请检查权限!’;
 $return_data[‘return’]=false;
 return $return_data;
 }
 }
save_path,‘/’).‘/’;//给路径加个斜杠 if(!move_uploaded_file(key][‘tmp_name’],_FILES[$key][‘name’])){ $return_data[‘error’]=‘临时文件移动失败,请检查权限!’;
 $return_data[‘return’]=false;
 return $return_data;
 }
 //如果以上都通过了,则返回这些值,存储的路径,新的文件名(不要暴露出去)
save_path.key][‘name’]; $return_data[‘return’]=true;
 return $return_data;
}
 $_FILESarray(1) {
 [“uploadfile”]=>
 array(5) {
 [“name”]=>
 string(11) “phpinfo.php”
 [“type”]=>
 string(24) “application/octet-stream”
 [“tmp_name”]=>
 string(53) “C:\Users\Administrator\AppData\Local\Temp\php8374.tmp”
 [“error”]=>
 int(0)
 [“size”]=>
 int(23)
 }
 }

由代码分析得知,服务端只校验了MIME类型,不校验文件后缀 , 直接修改绕过

BenchmarkJava 靶场通关_数据库_22

3、文件头检验

查看源代码

BenchmarkJava 靶场通关_数据库_23


校验函数是 upload , 跟进查看upload

//进行了严格的验证
 function upload(size,mime=array(),$save_path){_FILES); if(!isset(key][‘error’])){ $return_data[‘error’]=‘请选择上传文件!’;
 $return_data[‘return’]=false;
 return KaTeX parse error: Expected 'EOF', got '}' at position 18: …turn_data; }̲ if (_FILES[$key][‘error’]!=0) {
arr_errors[key][‘error’]]; $return_data[‘return’]=false;
 return KaTeX parse error: Expected 'EOF', got '}' at position 18: …turn_data; }̲ // 上面两个是查看…_FILES[$key][‘tmp_name’])){
 $return_data[‘error’]=‘您上传的文件不是通过 HTTP POST方式上传的!’;
 $return_data[‘return’]=false;
 return $return_data;
 }
 //获取后缀名,如果不存在后缀名,则将变量设置为空
 // pathinfo() 函数以数组的形式返回关于文件路径的信息。
_FILES[arr_filename[‘extension’])){ $arr_filename[‘extension’]=‘’;
 }
 //先验证后缀名 , 后缀名转成小写然后判断是否在 arr_filename[‘extension’]),$type)){//转换成小写,在比较type).‘中的一个’; $return_data[‘return’]=false;
 return $return_data;
 }
//验证MIME类型,MIME类型可以被绕过 
if(!in_array($_FILES[$key]['type'], $mime)){
    $return_data['error']='你上传的是个假图片,不要欺骗我xxx!';
    $return_data['return']=false;
    return $return_data;
}
//通过getimagesize来读取图片的属性,从而判断是不是真实的图片,还是可以被绕过的
// getimagesize(文件名) 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 
if(!getimagesize($_FILES[$key]['tmp_name'])){
    $return_data['error']='你上传的是个假图片,不要欺骗我!';
    $return_data['return']=false;
    return $return_data;
}
//验证大小
if($_FILES[$key]['size']>$size){
    $return_data['error']='上传文件的大小不能超过'.$size.'byte(500kb)';
    $return_data['return']=false;
    return $return_data;
}

//把上传的文件给他搞一个新的路径存起来
if(!file_exists($save_path)){
    if(!mkdir($save_path,0777,true)){
        $return_data['error']='上传文件保存目录创建失败,请检查权限!';
        $return_data['return']=false;
        return $return_data;
    }
}
//生成一个新的文件名,并将新的文件名和之前获取的扩展名合起来,形成文件名称
$new_filename=str_replace('.','',uniqid(mt_rand(100000,999999),true));
if($arr_filename['extension']!=''){
    $arr_filename['extension']=strtolower($arr_filename['extension']);//小写保存
    $new_filename.=".{$arr_filename['extension']}";
}
//将tmp目录里面的文件拷贝到指定目录下并使用新的名称
$save_path=rtrim($save_path,'/').'/';
if(!move_uploaded_file($_FILES[$key]['tmp_name'],$save_path.$new_filename)){
    $return_data['error']='临时文件移动失败,请检查权限!';
    $return_data['return']=false;
    return $return_data;
}
//如果以上都通过了,则返回这些值,存储的路径,新的文件名(不要暴露出去)
$return_data['save_path']=$save_path.$new_filename;
$return_data['filename']=$new_filename;
$return_data['return']=true;
return $return_data;
}

这个时候发现只能使用图片马绕过
使用CMD制作一句话木马。
参数/b指定以二进制格式复制、合并文件; 用于图像类/声音类文件
参数/a指定以ASCII格式复制、合并文件。用于txt等文档类文件

copy 1.jpg/b+1.php 2.jpg

//意思是将1.jpg以二进制与1.php合并成2.jpg

那么2.jpg就是图片木马了。

BenchmarkJava 靶场通关_BenchmarkJava 靶场通关_24

五、命令执行

查看源代码:

BenchmarkJava 靶场通关_数据库_25


漏洞复现:

BenchmarkJava 靶场通关_BenchmarkJava 靶场通关_26