PHP代码审计之实战审代码篇1

本章代码来之各种php的cms历史漏洞源码,供小伙伴们学习, 本次三题

1. 仔细观察如下代码,思考代码有什么缺陷,可能由此引发什么样的问题?
//检测旧密码是否正确
if($password != '')
{$oldpassword = md5(md5($oldpassword));$r = $dosql->GetOne("SELECT `password` FROM `#@__member` WHERE `username`='$c_uname'");if($r['password'] != $oldpassword){ShowMsg(msg: '抱歉,旧密码错误!', gourl: '-1');exit();}
}
$sql = "UPDATE `#@__member` SET";
if($password != '')
{$password = md5(md5($password));$sql .= "password='$password',";
}
@$sql .= "question='$question', answer='$answer', cnname='$cnname', enname='$enname', sex='$sex', birthtype='$birthtype', birth_year='$birth_year', birth_month='$birth_month', birth_day='$birth_day', astro='$astro', bloodtype='$bloodtype', trade='$trade', live_prov='$live_prov', live_city='$live_city', live_country='$live_country', home_prov='$home_prov', home_city='$home_city', home_country='$home_country', cardtype='$cardtype', cardnum='$cardnum', intro='$intro', email='$email', qqnum='$qqnum', mobile='$mobile', telephone='$telephone', address_prov='$address_prov', address_city='$address_city', address_country='$address_country', address='$address', zipcode='$zipcode' WHERE id='$id' AND `username`='$c_uname'";
if($dosql->ExecNoneQuery($sql))
{ShowMsg(msg: '资料更新成功', gourl: '?c=edit');exit();
}

第一个if判断的作用是“判断用户提交的新密码是否为空”,在用户提交的新密码不为空的情况下,才会进行‘旧密码的比对’,如果提交的旧密码和数据库的查询结果不一致,代码退出执行结束。第二个if判断的作用仍为“判断用户提交的新密码是否为空”,在用户提交的新密码不为空的情况下,对新密码进行哈希运算,随后进行SQL语句的拼接

一定要password有值才可以吗?如果设置为空,你会惊奇地发现sql语句为我们准备了,而且其他的参数一定程度上可控,随后也执行了,if条件语句好像没那么重要!,————由此可能会引发两个漏洞

一是在不知道旧密码的情况下修改密码
        新密码设置为空,绕过两个if。在之后sql语句中找一个可控参数用sql拼接的方式将password字段加上。完成所有字段的更新

二是越权,我们不对password的字段进行处理,而是在后面的sql语句中将cnnam改成其他用用户的(对应用户的id也改变),sql语句执行是不是就把别人的信息改了!

2.仔细观察如下代码,思考代码有什么缺陷,可能由此引发什么样的问题?
<?php
require '../../inc/zzz_class.php';
$backurl=getform('backurl','get');
$path =is_mobile() ?  SITE_PATH.'wap/' :  SITE_PATH;
$url =conf('runmode')==1 ? $path.'index.php?location=user&backurl='.$backurl.'&act=' : $path.'?location=user&backurl='.$backurl.'&act=' ;
if ((get_session('uid')>0)){echo('document.write("  <a href='.$url.'userinfo><i class=\'ico login\'></i> 会员中心</a><a href='.$url.'loginout><i class=\'ico reg\'></i> 登出</a>")');
}else{echo('document.write("  <a href='.$url.'login><i class=\'ico login\'></i> 登录</a><a href='.$url.'reg><i class=\'ico reg\'></i> 注册</a>")');
}
?>

追入getform函数发现$backur是get传参,为可控参数。拼接到$url中,打印回显到前端,造成XSS漏洞

原句 <a href='.$url.'login>

document.write(" <a href=/zzzphp_jb51/?location=user&backurl=123&act=login><i class='ico login'></i> 登录</a><a href=/zzzphp_jb51/?location=user&backurl=123&act=reg><i class='ico reg'></i> 注册</a>")

攻击输出1 οnmοuseοver=alert(/document.domain/) y=

document.write(" <a href=/zzzphp_jb51/?location=user&backurl=1 οnmοuseοver=alert(/d0cument.domain/) y=&act=login><i class='ico login'></i> 登录</a><a href=/zzzphp_jb51/?location=user&backurl=1 οnmοuseοver=alert(/d0cument.domain/) y=&act=reg><i class='ico reg'></i> 注册</a>")

浏览器在执行document.write的时候会适当地增加引号

3.仔细观察如下代码,思考代码有什么缺陷,可能由此引发什么样的问题?
<?php
require '../../../inc/zzz_admin.php';
$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true);
$action = safe_word(getform('action','get'));
$upfolder = safe_word(getform('upfolder','get'));
switch ($action) {case 'config':$result = json_encode($CONFIG);break;    /* 上传图片 */case 'uploadimage':$result =tojson(upload($_FILES['upfile'],'image',$upfolder));break;   /* 上传涂鸦 */case 'uploadscrawl':   $upfile=getform('upfile','post');$result =tojson(up_base64($upfile,$upfolder));break;   /* 上传文件 */case 'uploadfile':$result =tojson(upload($_FILES['upfile'],'file',$upfolder));break;    /* 上传视频 */case 'uploadvideo':$result =tojson(upload($_FILES['upfile'],'video',$upfolder));break;  /* 列出图片 */case 'listimage':$size=safe_word(getform('size','get'));$start=safe_word(getform('start','get'));$uporder=safe_word(getform('uporder','get'));$end = $start + $size;$allowFiles=str_replace(",","|",conf('imageext'));$path = UPLOAD_DIR.$upfolder.'/';$files = getfiles($path, $allowFiles);foreach($files as $k=>$v){$sizes[$k] = $v['size'];$times[$k] = $v['mtime'];$names[$k] = $v['name'];}switch($uporder){case'size1'	: array_multisort($sizes,SORT_DESC,SORT_STRING, $files);break;case'size2'	: array_multisort($sizes,SORT_ASC,SORT_STRING, $files);break;	case'name1'	: array_multisort($names,SORT_DESC,SORT_STRING, $files);break;case'name2'	: array_multisort($names,SORT_ASC,SORT_STRING, $files);break;	case'mtime2'	: array_multisort($times,SORT_ASC,SORT_STRING, $files);break;		default		: array_multisort($times,SORT_DESC,SORT_STRING, $files);break;}	if (! count($files)) {return json_encode(array("state" => "no match file","list" => array(),"start" => $start,"total" => count($files)));}$len = count($files);for ($i =$start,$list = array(); $i <= $len-1 &&  $i <= $end; $i ++) {$list[] = $files[$i];			}$result = json_encode(array("state" => "SUCCESS","list" => $list,"start" => $start,"total" => count($files)));		break;/* 列出文件 */case 'listfile':$result = getfiles();break;/* 抓取远程文件 */case 'catchimage':$source=getform('source','post');$list = array();$state='ERROR';foreach ($source as $imgUrl) {$info =down_url(safe_url($imgUrl),$upfolder); if ($info['state']=="SUCCESS"){$state="SUCCESS";array_push($list, array(			"state" => "SUCCESS",				"title" => $info["title"],"url" => $info["url"],"source"=>$imgUrl));}else{array_push($list, array(			"state" => $info['state'],				"title" => $info["msg"]));}}$result =  json_encode(array('state' =>$state,'list' => $list));break;default:$result = json_encode(array('state' => '请求地址出错'));break;
}
/* 输出结果 */
if (isset($_GET["callback"])) {if (preg_match("/^[\w_]+$/", $_GET["callback"])) {echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';} else {echo json_encode(array('state' => 'callback参数不合法'));}
} else {echo($result);
}

 重要逻辑代码

$action = safe_word(getform('action','get'));

safe_word // 安全过滤字符串,仅仅保留 [a-zA-Z0-9_]

getform //get得到action参数返回

switch ($action) { //判断action执行流

/* 抓取远程文件 */case 'catchimage':$source=getform('source','post');$list = array();$state='ERROR';foreach ($source as $imgUrl) {$info =down_url(safe_url($imgUrl),$upfolder); if ($info['state']=="SUCCESS"){$state="SUCCESS";array_push($list, array(			"state" => "SUCCESS",				"title" => $info["title"],"url" => $info["url"],"source"=>$imgUrl));

post得到source 值,根据后面的foreach判断$source可为数组

safe_url() *// 使用正则表达式匹配允许的字符,/[a-zA-Z0-9,.:=@?_\/\s]/u 默认最大长度255

down_url 从远程下载文件并保存到本地,

重点关注文件扩展名的处理,进入down_url

重点关注$file_ext = file_ext( $url ) ?: 'jpg'; //如果无法获取到扩展名则默认为'jpg

后面对扩展名做了检测

$allext=conf('imageext').','.conf('fileext').','.conf('videoext');
if(!in_array($file_ext,splits($allext,','))){return array( 'msg' => '创建文件失败,禁止创建'.$file_ext.'文件!', 'state' => 'ERROR',  'error' => 5 );
}

 后面一顿翻找最终找到了这个允许的全局类

//图片上传限制 'imageext'=>'jpg,jpeg,gif,png',

//附件上传限制 'fileext'=>'pdf,txt,doc,docx,xls,xlsx,zip,rar',

//视频上传限制 'videoext'=>'mp4,flv,swf',//请注意空间90%以上不允许上传视频,或不支持视频格式

这些文件都可以上传,有什么思考?

1.用pdf打xss,用swf打xss

2.用压缩包钓鱼,用docx钓鱼,压缩包炸弹

3.用文件打服务器空间

4.可以结合文件包含漏洞打入php马

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 表格相关API

1.文本框 限制输入数据类型&#xff08;如仅英文&#xff09; QValidator* validator new QRegExpValidator(QRegExp("[a-zA-Z]"), lineText); // 创建正则表达式验证器lineText->setValidator(validator); // 将验证器设置给 QLineEdit QLineEdit&#xff1a;单…

(2023|ICLR,文本反演,LDM,伪词)一个词描述一张图像:使用文本反演个性化文本到图像的生成

An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion 公纵号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方…

react内置组件之<StrictMode></StrictMode>

1、作用&#xff1a; <StrictMode> 是 React 提供的一个组件&#xff0c;用于帮助开发者在开发过程中检测潜在的问题&#xff0c;并修复一些常见的警告。 使用 <StrictMode> 组件包裹应用程序或组件可以启用一些额外的检查和警告。它可以帮助你捕获可能的错误、发…

QSqlQueryModel

QSqlQueryModel 是 Qt 框架中的一个模型类&#xff0c;用于在 Qt 的视图组件&#xff08;如 QTableView、QListView&#xff09;中显示数据库查询结果。 QSqlQueryModel 继承自 QAbstractTableModel&#xff0c;它通过执行 SQL 查询并将结果存储在内部数据结构中&#xff0c;提…

Vue 2.x跟Vue 3.x有啥区别

大家好&#xff0c;我是咕噜-凯撒&#xff0c;我们都知道Vue 是一款比较流行的前端JavaScript 框架&#xff0c;在他演进的过程中出现了2个主要版本&#xff0c;Vue 2.x 和 Vue 3.x。这两个版本之间有很多的区别&#xff0c;下面我以自己的理解介绍一下他们之间的区别。 响应性…

thinkphp8.0是否兼容thinkphp5.0?

ThinkPHP 8.0 是 ThinkPHP 框架的一个较新版本&#xff0c;而 ThinkPHP 5.0 是其前一个主要版本。每当框架进行主要版本升级时&#xff0c;都会有许多变化&#xff0c;可能包括对现有功能的改进、新功能的添加以及不再支持旧功能。这些变化可能会导致与以前版本的不兼容。 Thi…

流行的 React 相关库和框架

React 本身就是一个非常流行的 JavaScript 库&#xff0c;用于构建用户界面&#xff0c;特别是单页面应用。不过&#xff0c;有许多其他的库和框架与 React 结合使用&#xff0c;以提供额外的功能和优化开发体验。以下是一些最流行的 React 相关库和框架&#xff1a; Next.js&a…

开源的数据流技术,该选择Redpanda还是Apache Kafka?

本文将比较Apache Kafka和Redpanda两种开源的数据流技术&#xff0c;在云原生实时处理能力上的不同&#xff0c;以及如何在项目中做出选择。 目前&#xff0c;Apache Kafka不但成为了数据流处理领域事实上的标准&#xff0c;而且带动了同类产品的出现。Redpanda就是其中之一…

DeCap DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING

DeCap: DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING 论文&#xff1a;https://arxiv.org/abs/2303.03032 代码&#xff1a;https://github.com/dhg-wei/DeCap OpenReview&#xff1a;https://openreview.net/forum?idLt8bMlhiwx2 TL; DR&#xff…

AIGC(生成式AI)试用 15 -- 小结

断断续续的尝试在实际的工作使用中理解和测试AIGC&#xff0c;运用会越来越多、越来越广范&#xff0c;但也是时候做个小结了。 没有太用热火的ChatGPT&#xff0c;只是拿了日常最容易用到的CSDN创作助手&#xff08;每周写文章总是看到&#xff09;和文心一言&#xff08;…

多层记忆增强外观-运动对齐框架用于视频异常检测 论文阅读

MULTI-LEVEL MEMORY-AUGMENTED APPEARANCE-MOTION CORRESPONDENCE FRAMEWORK FOR VIDEO ANOMALY DETECTION 论文阅读 摘要1.介绍2.方法2.1外观和运动对其建模2.2.记忆引导抑制模块2.3. Training Loss2.4. Anomaly Detection 3.实验与结果4.结论 论文标题&#xff1a;MULTI-LEVE…

springboot整合vue,将vue项目整合到springboot项目中

将vue项目打包后&#xff0c;与springboot项目整合。 第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-t…

虚拟机下Ubuntu上网设置

文章目录 一、虚拟机上网的两种方式1.1 NAT模式&#xff08;Network Address Translation&#xff09;1.2 桥接模式&#xff08;Bridge Mode&#xff09;1.3 简介 二、实际配置2.1 NAT模式配置2.2 桥接模式配置 之前跟着博客配了好几个也没用&#xff0c;后来自己慢慢模式实践测…

MySQL数据库 DML

目录 DML概述 添加数据 修改数据 删除数据 DML概述 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据(工NSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据 (1)给指定字段添加数据 INSERT …

【FPGA/verilog -入门学习9】verilog基于查找表的8位格雷码转换

本文参考&#xff1a;FPGA杂记5——格雷码转换设计-CSDN博客 1&#xff0c;什么是查表法&#xff0c;做什么用&#xff0c;有什么好处 查找表&#xff08;Look-Up-Table&#xff09; 查找表&#xff0c;简单说&#xff0c;就是一个预先存储好结果的数据表 通过访问这张预先存储…

JS之sort排序

在我们JS排序中&#xff0c;有许多排序的方法&#xff0c;比如冒泡排序、选择排序等等。这次我为大家介绍一下sort排序&#xff01; sort 按照 Unicode code 位置排序&#xff0c;默认升序 默认情况下&#xff0c;sort()会按照升序重新排序数组&#xff0c;即最小值在前最大值…

【数据分享】2019-2023年我国区县逐年新房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现&#xff0c;一个区域的房价越高通常代表这个区域越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享了2019—2023年我国区县逐月的新房房价数据&a…

209. 长度最小的子数组

暴力法&#xff1a;超时 java public int minSubArrayLen(int target, int[] nums) {int ans 0;int n nums.length;for (int l 1; l < n; l) {// initializationint sum 0;for (int i 0; i < l; i) {sum nums[i];}if (sum target) ans l;for (int i l; i <…

解决“bat中文路径乱码“问题

今天&#xff0c;在使用.bat脚本&#xff0c;将hello.png从"D:\mypic\备份"目录&#xff0c;拷贝到"D:\mypic\备份"时&#xff1b;发现中文乱码,弹出如下对话框: 图(1) bat中文路径乱码 原来的命令是&#xff1a; copy D:\mypic\one\hello.png D:\mypic\备…

【LangChain学习之旅】—(3) LangChain快速构建本地知识库的智能问答系统

【LangChain学习之旅】—&#xff08;3&#xff09; LangChain快速构建本地知识库的智能问答系统 项目及实现框架开发框架核心实现机制数据准备及加载加载文本文本的分割向量数据库存储文本的“嵌入”概念向量数据库概念 相关信息获取RetrievalQA生成回答并展示示例小结 Refere…