生命在于折腾——皮卡丘靶场源码审计(一)

在这里插入图片描述
图片来源于百度图片。
注意:本篇文章仅用于学习以及笔记记录,不得用于其他违规用途。

一、环境搭建

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

二、SQL注入代码审计

1、数字型SQL注入

在这里插入图片描述
如图所示为SQL数字型注入页面,找到该网页源码。
下图为关键代码:
在这里插入图片描述
这里面的SQL语句前后无过滤和判断,使用burp抓包复现:
在这里插入图片描述
复现出这种即可证明存在该漏洞。

2、字符型SQL注入

查看源代码:
在这里插入图片描述
漏洞复现:
在这里插入图片描述

3、http头注入

查看源码:
在这里插入图片描述
漏洞复现
在这里插入图片描述

4、盲注

查看源码:
在这里插入图片描述
漏洞复现:
payload:
kobe’%20and%20’1’=‘1
kobe’%20and%20’1’='2
在这里插入图片描述

5、宽字节注入

查看源码:
在这里插入图片描述
漏洞复现:
在这里插入图片描述

三、XSS代码审计

1、反射型XSS

查看源码:
在这里插入图片描述
漏洞复现:
在这里插入图片描述
输入
在这里插入图片描述

2、存储型XSS

查看源码:
在这里插入图片描述
直接输出用户提交的数据 , 触发储存型XSS
在这里插入图片描述
漏洞复现:
在这里插入图片描述

四、文件上传

1、前端限制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、服务端校验

代码分析:
在这里插入图片描述具体函数定义
//只通过MIME类型验证了一下图片类型,其他的无验证,upsafe_upload_check.php
function upload_sick( k e y , key, key,mime,$save_path){
$arr_errors=array(
1=>‘上传的文件超过了 php.ini中 upload_max_filesize 选项限制的值’,
2=>‘上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值’,
3=>‘文件只有部分被上传’,
4=>‘没有文件被上传’,
6=>‘找不到临时文件夹’,
7=>‘文件写入失败’
);
// F I L E S 是一个全局数组变量 , 元素也是一个数组 , k e y 为固定的 u p l o a d f i l e / / 判断是否上传失败 i f ( ! i s s e t ( _FILES是一个全局数组变量 , 元素也是一个数组 , key为固定的uploadfile // 判断是否上传失败 if(!isset( FILES是一个全局数组变量,元素也是一个数组,key为固定的uploadfile//判断是否上传失败if(!isset(_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) {
r e t u r n d a t a [ ′ e r r o r ′ ] = return_data['error']= returndata[error]=arr_errors[ F I L E S [ _FILES[ FILES[key][‘error’]];
$return_data[‘return’]=false;
return $return_data;
}
//验证一下MIME类型 $mime为白名单数组 , 判断如果不在白名单数组中
//恰巧 k e y ] [ ′ t y p e ′ ] 前端可控可以绕过 i f ( ! i n a r r a y ( key]['type'] 前端可控可以绕过 if(!in_array( key][type]前端可控可以绕过if(!inarray(_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;
}
}
s a v e p a t h = r t r i m ( save_path=rtrim( savepath=rtrim(save_path,‘/’).‘/’;//给路径加个斜杠
if(!move_uploaded_file( F I L E S [ _FILES[ FILES[key][‘tmp_name’], s a v e p a t h . save_path. savepath._FILES[$key][‘name’])){
$return_data[‘error’]=‘临时文件移动失败,请检查权限!’;
$return_data[‘return’]=false;
return $return_data;
}
//如果以上都通过了,则返回这些值,存储的路径,新的文件名(不要暴露出去)
r e t u r n d a t a [ ′ n e w p a t h ′ ] = return_data['new_path']= returndata[newpath]=save_path. F I L E S [ _FILES[ FILES[key][‘name’];
$return_data[‘return’]=true;
return $return_data;

}
$_FILES

array(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类型,不校验文件后缀 , 直接修改绕过
在这里插入图片描述

3、文件头检验

查看源代码
在这里插入图片描述
校验函数是 upload , 跟进查看upload
//进行了严格的验证
function upload( k e y , key, key,size, t y p e = a r r a y ( ) , type=array(), type=array(),mime=array(),$save_path){
a r r e r r o r s = a r r a y ( 1 = > ′ 上传的文件超过了 p h p . i n i 中 u p l o a d m a x f i l e s i z e 选项限制的 值 ′ , 2 = > ′ 上传文件的大小超过了 H T M L 表单中 M A X F I L E S I Z E 选项指定的 值 ′ , 3 = > ′ 文件只有部分被上 传 ′ , 4 = > ′ 没有文件被上 传 ′ , 6 = > ′ 找不到临时文件 夹 ′ , 7 = > ′ 文件写入失 败 ′ ) ; / / v a r d u m p ( arr_errors=array( 1=>'上传的文件超过了 php.ini中 upload_max_filesize 选项限制的值', 2=>'上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 3=>'文件只有部分被上传', 4=>'没有文件被上传', 6=>'找不到临时文件夹', 7=>'文件写入失败' ); // var_dump( arrerrors=array(1=>上传的文件超过了php.iniuploadmaxfilesize选项限制的,2=>上传文件的大小超过了HTML表单中MAXFILESIZE选项指定的,3=>文件只有部分被上,4=>没有文件被上,6=>找不到临时文件,7=>文件写入失);//vardump(_FILES);
if(!isset( F I L E S [ _FILES[ FILES[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) {
r e t u r n d a t a [ ′ e r r o r ′ ] = return_data['error']= returndata[error]=arr_errors[ F I L E S [ _FILES[ FILES[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() 函数以数组的形式返回关于文件路径的信息。
a r r f i l e n a m e = p a t h i n f o ( arr_filename=pathinfo( arrfilename=pathinfo(_FILES[ k e y ] [ ′ n a m e ′ ] ) ; / / 判断是否有后缀 i f ( ! i s s e t ( key]['name']); // 判断是否有后缀 if(!isset( key][name]);//判断是否有后缀if(!isset(arr_filename[‘extension’])){
$arr_filename[‘extension’]=‘’;
}
//先验证后缀名 , 后缀名转成小写然后判断是否在 t y p e 白名单后缀中 i f ( ! i n a r r a y ( s t r t o l o w e r ( type 白名单后缀中 if(!in_array(strtolower( type白名单后缀中if(!inarray(strtolower(arr_filename[‘extension’]),$type)){//转换成小写,在比较
r e t u r n d a t a [ ′ e r r o r ′ ] = ′ 上传文件的后缀名不能为空,且必须 是 ′ . i m p l o d e ( ′ , ′ , return_data['error']='上传文件的后缀名不能为空,且必须是'.implode(',', returndata[error]=上传文件的后缀名不能为空,且必须.implode(,,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就是图片木马了。
在这里插入图片描述

五、命令执行

查看源代码:
在这里插入图片描述
漏洞复现:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然可以!使用Python的海龟绘图库可以让我们绘制出皮卡丘的图像。下面是一个简单的示例代码: ```python import turtle as t # 设置画布大小和背景色 t.setup(800, 600) t.bgcolor('yellow') # 绘制皮卡丘的头部 t.penup() t.goto(-100, 100) t.pendown() t.fillcolor('yellow') t.begin_fill() t.circle(100) t.end_fill() # 绘制皮卡丘的眼睛 t.penup() t.goto(-60, 120) t.pendown() t.fillcolor('white') t.begin_fill() t.circle(20) t.end_fill() t.penup() t.goto(-40, 120) t.pendown() t.fillcolor('black') t.begin_fill() t.circle(10) t.end_fill() t.penup() t.goto(-140, 120) t.pendown() t.fillcolor('white') t.begin_fill() t.circle(20) t.end_fill() t.penup() t.goto(-120, 120) t.pendown() t.fillcolor('black') t.begin_fill() t.circle(10) t.end_fill() # 绘制皮卡丘的嘴巴 t.penup() t.goto(-80, 30) t.pendown() t.setheading(-60) t.circle(80, 120) t.fillcolor('black') t.begin_fill() t.circle(80, 120) t.setheading(0) t.circle(80, 120) t.end_fill() # 绘制皮卡丘的脚 t.penup() t.goto(-70, -70) t.pendown() t.setheading(-30) t.forward(80) t.setheading(0) t.forward(40) t.setheading(90) t.fillcolor('black') t.begin_fill() t.circle(40, 180) t.end_fill() t.setheading(180) t.forward(40) t.setheading(-90) t.circle(40, 180) t.setheading(-60) t.forward(80) # 绘制皮卡丘的手臂 t.penup() t.goto(30, -70) t.pendown() t.setheading(-30) t.forward(80) t.setheading(0) t.forward(40) t.setheading(90) t.fillcolor('black') t.begin_fill() t.circle(40, 180) t.end_fill() t.setheading(180) t.forward(40) t.setheading(-90) t.circle(40, 180) t.setheading(-60) t.forward(80) # 隐藏画笔 t.hideturtle() # 完成绘制 t.done() ``` 运行以上代码,即可在窗口中看到绘制出的皮卡丘图像。你也可以根据需要调整代码中的坐标和尺寸来绘制更精确的图像。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值