Web 安全 PHP 代码审查之常规漏洞

news2025/3/9 10:00:41

前言

工欲善其事,必先利其器。我们做代码审计之前选好工具也是十分必要的。下面我给大家介绍两款代码审计中比较好用的工具。

一、审计工具介绍

PHP 代码审计系统— RIPS

功能介绍

RIPS 是一款基于 PHP 开发的针对 PHP 代码安全审计的软件。

另外,它也是一款开源软件,由国外安全研究员 Johannes Dahse 开发,程序只有 450KB,目前能下载到的最新版是0.55。

在写这段文字之前笔者特意读过它的源码,它最大的亮点在于调用了 PHP 内置解析器接口token_get_all

并且使用Parser做了语法分析,实现了跨文件的变量及函数追踪,扫描结果中非常直观地展示了漏洞形成及变量传递过程,误报率非常低。

RIPS 能够发现 SQL 注入、XSS 跨站、文件包含、代码执行、文件读取等多种漏洞,支持多种样式的代码高亮。比较有意思的是,它还支持自动生成漏洞利用。

安装方法

下载地址:https://jaist.dl.sourceforge.net/project/rips-scanner/rips-0.55.zip.

解压到任意一个PHP的运行目录

在浏览器输入对应网址,可以通过下图看到有一个path 在里面填写你要分析的项目文件路径,点击 scan.

界面截图

seay 源代码审计系统

功能介绍

这些是seay 第一个版本的部分功能,现在最新版本是2.1。

  1. 傻瓜化的自动审计 。

  2. 支持php代码调试 。

  3. 函数/变量定位 。

  4. 生成审计报告。

  5. 自定义审计规则 。

  6. mysql数据库管理 。

  7. 黑盒敏感信息泄露一键审计 。

  8. 支持正则匹配调试 。

  9. 编辑保存文件 。

  10. POST数据包提交 。

安装方法

安装环境需要 .NET2.0以上版本环境才能运行,下载安装包之后点击下一步就安装好了,非常的简便。

安装包下载地址:http://enkj.jb51.net:81/201408/tools/Seayydmsjxt(jb51.net).rar

操作界面的截图

 

二、代码审计实战

通过刚才安装的两个审计工具运行后我们可以发现,会分析出很多隐藏的漏洞,那下面我们看看其中的SQL注入、XSS、CSRF产生的原因,通过原因来分析如何去审计代码。

SQL注入

SQL注入漏洞一直是web系统漏洞中占比非常大的一种漏洞,下面我们来看看SQL注入的几种方式。

SQL 注入漏洞分类

从利用方式角度可以分为两种类型:常规注入、宽字节注入。

常规注入方式,通常没有任何过滤,直接把参数存放到了SQL语句当中,如下图。

非常容易发现,现在开发者一般都会做一些过滤,比如使用addslashes(),但是过滤有时候也不一定好使。

编码注入方式

宽字节注入,这个是怎么回事呢?

在实际环境中程序员一般不会写上面类似的代码,一般都会用addslashes()等过滤函数对从web传递过来的参数进行过滤。不过有句话叫做,道高一尺魔高一丈,我们看看白帽子是怎么突破的。用PHP连接MySQL的时候,当设置 character_set_client=gbk时候会导致一个编码漏洞。我们知道addslashes() 会把参数 1’ 转换成 1\’,而我们提交参数 1%df’ 时候会转成 1縗’,那我们输入 1%df’ or 1=1%23时候,会被转换成 1縗’ or 1=1#’。

简单来说%df’会被过滤函数转义为%df\’ ,%df\’ = %df%5c%27  在使用gbk编码的时候会认为%df%5c是一个宽字节%df%5c%27=縗’,这样就会产生注入。

那如何防御这个宽字节呢?我希望大家开发网站尽量使用UTF8编码格式,如果转换麻烦,最安全的方法就是使用PDO预处理。挖掘这种漏洞主要是检查是否使用了gbk,搜索guanjianc character_set_client=gbk 和mysql_set_chatset('gbk')

二次urldecode注入,这中方式也是因为使用了urldecode不当所引起的漏洞。

我们刚才知道了 addslashes()函数可以防止注入,他会在(‘)、(“)、()前面加上反斜杠来转义。

那我们假设我们开启了GPC,我们提交了一个参数,/test.php?uid=1%2527,因为参数中没有单引号,所以第一次解码会变成uid=1%27,%25解码出来就是%,

这时候程序里如果再去使用urldecode来解码,就会把%27解码成单引号(‘),最终的结果就是uid=1’.

我们现在知道了原有是因为urldecode引起的,我们可以通过编辑器的搜索urldecode和rawurldecode找到二次url漏洞。

从漏洞类型区分可以分为三种类型:

  1. 可显

    攻击者可以直接在当前界面内容中获取想要获得的内容。

  2. 报错

    数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中。

    所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容,所以我建议在数据库类中设置不抛出错误信息。

  3. 盲注

    数据库查询结果无法从直观页面中获取攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。

SQL 注入漏洞挖掘方法

针对上面提到的利用漏洞方法,总结了以下的挖掘方法:

  1. 参数接收位置,检查是否有没过滤直接使用  _POST、$_COOKIE 参数的。

  2. SQL语句检查,搜索关键词 select update insert 等SQL语句关键处,检查SQL语句的参数是否可以被控制。

  3. 宽字节注入,如果网站使用的 GBK 编码情况下,搜索guanjianc character_set_client=gbkmysql_set_chatset('gbk') 就行。

  4. 二次 urldecode 注入,少部分情况,gpc 可以通过编辑器的搜索 urldecode 和 rawurldecode 找到二次url漏洞。

SQL 注入漏洞防范方法

虽然SQL注入漏洞非常多,但是防范起来却挺简单的,下面介绍几个过滤函数和类:

  • gpc/rutime 魔术引号

  • 过滤函数和类

    • addslashes

    • mysql_real_escape_string

    • intval

  • PDO 预处理

XSS跨站

前言

XSS 又叫 CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意的特殊目的。

XSS 属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。在 WEB2.0 时代,强调的是互动,使得用户输入信息的机会大增,在这个情况下,我们作为开发者,在开发的时候,要提高警惕。

xss 漏洞分类
  1. 反射型,危害小,一般

    反射型XSS原理:就是通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特定的代码参数会被HTML解析,执行,如此就可以获取用户的COOIKE,进而盗号登陆。比如hack甲构造好修改密码的URL并把密码修改成123,但是修改密码只有在登陆方乙才能修改,乙在登陆的情况下点击甲构造好的URL将直接在不知情的情况下修改密码。

    特点是:非持久化,必须用户点击带有特定参数的链接才能引起。

  2. 存储型,危害大,影响时间长

    存储型XSS原理,假设你打开了一篇正常的文章页面,下面有评论功能。这个时候你去评论了一下,在文本框中输入了一些JavaScript代码,提交之后,你刷新这个页面后发现刚刚提交的代码又被原封不动的返回来并且执行了。

    这个时候你会想,我要写一段 JavaScript 代码获取 cookie 信息,然后通过ajax发送到自己的服务器去。构造好代码后你把链接发给其他的朋友,或者网站的管理员,他们打开 JavaScript 代码就执行了,你服务器就接收到了sessionid,你就可以拿到他的用户权限了。

3.dom型,特殊的一种

dom型 XSS 是因为 JavaScript 执行了dom 操作,所造成的 XSS 漏洞,具体如下图。可以看到虽然经过 html 转义了,但是这块代码在返回到 html 中,又被 JavaScript 作为 dom 元素操作。那当我输入?name=<img src=1 onerror=alert(1)> 的时候依然会存在 XSS 漏洞。

 

xss 漏洞挖掘方法

根据上面的一些特点,可以总结出几个分析出几个挖掘方法:

  1. 数据接收位置,检查 _POST、$_COOKIE是否经过转义。

  2. 常见的反射型XSS搜索这种类似位置发现次数较多。

  3. 而存储型在文章,评论出现比较多。

XSS 漏洞防范方法

  1. 转义html实体,有两种方式:在入口和出口,我建议是在入口处转义,防止出口位置取出来的时候忘记转义,如果已经在入口转义了,出口位置就不用再次转义。

  2. 在富文本编辑器中,经常会用到一些元素的属性,比如上图的onerror,那我们还需对元素的属性建立黑白名单。

  3. httpOnly 即使存在xss漏洞,可以把危害大大降低。

CSRF漏洞

CSRF 漏洞介绍

CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户。

而 CSRF 则通过伪装来自受信任用户的请求来利用受信任的网站。与 XSS 攻击相比,CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

csrf 主要用来做越权操作,而且 csrf 一直没有被关注起来,所以很多程序现在也没有相关的防范措施。

CSRF 案例

我们来看下面的一段代码,这个表单当被访问到的时候,用户就退出了登录。假设有一个转账的表单,只需要填写对方的用户名,和金额就可以,那如果我提前把 URL 构造好,发给受害者,当点击后,钱就被转走了。

或者我把这个 URL 放到我的网页中,通过<img src="我构造的URL" ,当其他人打开我的网址后,就中招了。

CSRF漏洞挖掘方法

通过上面的描述,我们知道了漏洞的原有,那我们审计的时候可以检查处理表单有没有以下判断。

  1. 是否有验证 token。

  2. 是否有图片验证码。

  3. 是否有 refe 信息。

如果三个判断都没有,那么就存在了 CSRF 漏洞,CSRF 不仅限于 GET 请求, POST 请求同样存在。

CSRF 漏洞防范方法

  1. 图片验证码,这个想必大家都知道,但是用户体验并不好,我们可以看下面的一些处理方法。

  2. token验证。

    token验证方法如下,每次访问表单页的时候,生成一个不可预测的token存放在服务器session中,另外一份放页面中,提交表单的时候需要把这个token带过去,接收表单的时候先验证一下token是否合法。

  3. Referer信息验证

    大多数情况下,浏览器访问一个地址,其中header头里面会包含Referer信息,里面存储了请求是从哪里发起的。

    如果HTTP头里包含有Referer的时候,我们可以区分请求是同域下还是跨站发起的,所以我们也可以通过判断有问题的请求是否是同域下发起的来防御 CSRF 攻击。

    Referer 验证的时候有几点需要注意,如果判断Referer是否包含 *.XXX.com,如果有子域名有漏洞,会存在绕过的可能。

    如果判断的条件的是Referer中是否包含字符 ‘xxx.com’  那攻击者在他目录中建立一个 xxx.com 文件夹同样存在绕过的可能。如果可以最合适的判断是,直接判断是否等于当前域名。

三、常规漏洞的防范方法

taint PHP 安全扩展

功能介绍

Taint 可以用来检测隐藏的 XSS code, SQL 注入, Shell注入等漏洞,并且这些漏洞如果要用静态分析工具去排查, 将会非常困难, 我们来看下面这张图:

 

安装方法

  • 下载 taint:  http://pecl.php.net/package/taint

  • 配置

 

/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install

  • 更加详细的可以参考:http://www.cnblogs.com/linzhenjie/p/5485474.html

应用场景

开发团队要求每个人都做到非常的安全比较难,但是把taint安装在开发环境,特别适合,一看到 warning 信息一般都回去改。

ngx_lua_waf

功能介绍

  1. 防止 sql 注入,本地包含,部分溢出,fuzzing 测试,xss,SSRF 等 web攻击。

  2. 防止 svn /备份之类文件泄漏。

  3. 防止 ApacheBench 之类压力测试工具的攻击。

  4. 屏蔽常见的扫描黑客工具,扫描器。

  5. 屏蔽异常的网络请求。

  6. 屏蔽图片附件类目录 php 执行权限。

  7. 防止 webshell 上传。

安装方法

  • 安装依赖: luajitngx_devel_kitnginx_lua_module

  • 安装nginxngx_lua_waf

  • nginx.conf 里的 http 添加配置

  • 详细安装文档

效果图

总结

这次分享的内容代码审计处理常规漏洞部分挑选了三种类型,还有其他的一些一次也讲不完。代码身材除了像刚才的的参数检查之外,还有逻辑性漏洞审查,下次如果有时间会再做一次逻辑漏洞审计分享。

网络安全学习路线 (2024最新整理)

 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言扣1或者关注我我后台会主动发给你! 

第一阶段:安全基础

网络安全行业与法规

Linux操作系统

计算机网络

HTML PHP Mysql Python基础到实战掌握

  第二阶段:信息收集

IP信息收集

域名信息收集

服务器信息收集

Web网站信息收集

Google hacking

Fofa网络安全测绘

 第三阶段:Web安全 

SQL注入漏洞

XSS

CSRF漏洞

文件上传漏洞

文件包含漏洞

SSRF漏洞

XXE漏洞

远程代码执行漏洞

密码暴力破解与防御

中间件解析漏洞

反序列化漏洞

 第四阶段:渗透工具 

MSF

Cobalt strike

Burp suite

Nessus   Appscea   AWVS

Goby   XRay

Sqlmap

Nmap

Kali

 第五阶段:实战挖洞 

漏洞挖掘技巧

Src

Cnvd

众测项目

热门CVE漏洞复现

靶场实战

学习资料的推荐

学习框架已经整理完毕,现在就差资料资源了,我这里整理了所有知识点对应的资料资源文档,大家不想一个一个去找的话,可以参考一下这些资料!

1.视频教程

 2.SRC技术文档&PDF书籍 

3.大厂面试题    

特别声明:

此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。

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

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

相关文章

掌握JavaScript,轻松实现自动化测试!

随着软件开发的不断发展&#xff0c;自动化测试在保证软件质量和提高开发效率方面扮演着越来越重要的角色。而在自动化测试过程中&#xff0c;JavaScript作为一种强大的脚本语言&#xff0c;为我们提供了丰富的工具和功能。本文将介绍在自动化测试中&#xff0c;掌握JavaScript…

一致性的艺术:深度剖析Paxos在分布式事务模型中的精妙设计

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 在数字化浪潮的推动下&#xff0c;分布式系统已经成为现代IT架构的基石。它们支撑着我们日常使用的在线服务&#xff0c;从电商购物到金融交易&#xff0c;从社交网络到云计算平台。然…

rmallox勒索病毒肆虐,如何保护网络安全?

rmallox勒索病毒与网络安全的关系可以从以下几个方面来阐述&#xff1a; 一、rmallox勒索病毒的特性 rmallox勒索病毒是一种极具破坏性的计算机病毒&#xff0c;它具有多个显著特性&#xff0c;这些特性使得该病毒对网络安全构成了严重威胁。具体来说&#xff0c;rmallox病毒具…

制造业如何挖掘数据价值,附数据分析处理软件推荐

制造业如何挖掘和利用数据价值&#xff1f; 在信息化、智能化高速发展的今天&#xff0c;制造业正迎来一场由数据驱动的深刻变革。数据&#xff0c;作为这场变革的核心驱动力&#xff0c;正被制造业企业深度挖掘和利用&#xff0c;以实现更高效、更智能的生产模式。 制造业在利…

基于Springboot的实习生管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的实习生管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

具身触觉社区| “大咖面对面”第一期活动顺利举行

4月27日&#xff0c;由中国人工智能学会认知系统与信息处理专委会组织的“具身触觉社区”第一期“大咖面对面”分享活动顺利举行&#xff0c;我们邀请到了美国麻省理工学院&#xff08;MIT&#xff09;博士、视触觉传感器的奠基人、GelSight指尖传感器发明人李瑞老师为社区带来…

Linux 第三十章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

CSS学习笔记之中级教程(一)

1、CSS 布局 - display 属性 1.1 display 属性 display 属性是用于控制布局的最重要的 CSS 属性。 display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 …

Hbase基础操作Demo(Java版)

一、前置条件 HBase服务&#xff1a;【快捷部署】023_HBase&#xff08;2.3.6&#xff09;开发环境&#xff1a;Java&#xff08;1.8&#xff09;、Maven&#xff08;3&#xff09;、IDE&#xff08;Idea 或 Eclipse&#xff09; 二、相关代码 代码结构如上图中①和② pom.x…

CNN实现fashion_mnist数据集分类(tensorflow)

1、查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、加载fashion_mnist数据与预处理 import numpy as np (train_images,train_labels),(test_images,test_labels) tf.keras.d…

2024年5月树莓集团快讯

树莓集团近期快讯 1 园区专场招聘会进校园 国际数字影像产业园联合四川城市职业学院的专场招聘会成功召开&#xff0c;共计提供400余个工作岗位。 2 园区硬件优化再升级 园区硬件优化再升级&#xff0c;智能门禁系统及人脸识别系统下周投入使用。 3 基地短剧合作交流 天府…

第10篇:创建Nios II工程之控制单个七段数码管

Q&#xff1a;还记得之前使用Verilog case语句来描述实现七段数码管的逻辑功能。本期我们创建Nios II工程用C语言代码实现相同的功能。 A&#xff1a;基本原理&#xff1a;一个七段数码管由7个发光二极管LED组成&#xff0c;所以控制一个数码管的显示即控制7个LED。我们在之前…

江门水文分局开展防灾减灾主题宣传活动

5月11日&#xff0c;第16个全国防灾减灾日到来之际&#xff0c;广东省水文局江门水文分局联合江门市五邑义工联合会直属义工服务总队&#xff08;亲子服务队&#xff09;在江门市万达广场举办了一场别开生面的防灾减灾主题宣传活动&#xff0c;进一步培育孩子们的防灾减灾的意识…

[ACTF新生赛2020]SoulLike

没见过的错误&#xff1a; ida /ctg目录下的hexrays.cfg文件中的MAX_FUNCSIZE64 改为 MAX_FUNCSIZE1024 然后就是一堆数据 反正就是12个字符 from pwn import * flag"actf{" k0 for n in range(12):for i in range(33,127):pprocess("./SoulLike")_flag…

调剂”小清华“、不保护一志愿?——兰州大学25计算机考研考情分析

兰州大学&#xff08;Lanzhou University&#xff09;&#xff0c;简称“兰大”&#xff0c;是中华人民共和国教育部直属 全国重点大学&#xff0c;中央直管副部级建制&#xff0c;位列国家首批“双一流(A 类)”、“211 工 程”、“985 工程”大学行列&#xff0c;入选国家“珠…

asp.net core mvc razor动态编译

开发mvc过程中razor页面需要重启才能编译&#xff0c;非常麻烦&#xff0c;能否实现动态编译&#xff0c;微软官方提供了一个包能实现 新建.net 6 mvc项目 安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 修改csproj <Project Sdk"Microsoft.NET.Sdk.Web…

拉链表实现过程+案例

第一种 1.从ODS层获取增量数据(上一天新增和更新的数据) 2.拿着DWD原始拉链表数据 left join 增量数据 ,修改原始拉链中历史数据的结束时间 3.拿着left join 的结果集 union all 增量数据 4.把最新的拉链数据优先保存到DWD对应的临时表中 5.使用insertselect 方式把临时表中…

宝塔纯净版 7.6.0版本无需手机登录 [稳定版本/推荐]

下载地址&#xff1a;宝塔纯净版 7.6.0版本无需手机登录.zip 宝塔纯净版介绍 无需手机登录&#xff1a;不再有手机登录提示&#xff0c;或按照提示输入任意手机号密码即可模拟绑定&#xff1b; 安全&#xff1a;剥离了所有与宝塔官方的通信、上报、下发&#xff1b;并且不与…

栈和队列经典OJ题详解

目录 一、用栈实现队列 1.1 题目 1.2 思路 1.3 C语言题解 1.3.1 栈接口 1.3.2 代码实现 二、用队列实现栈 2.1 题目 2.2 思路 2.2.1 如何设计出栈 2.2.2 如何设计入栈 2.3 C语言题解 2.3.1 队列接口 2.3.2 代码实现 三、括号匹配问题 3.1 题目 3.2 思路 3.3 …

【C++】继承与多态的一些练习题

学习完了继承与多态&#xff0c;当然要来点练习题啦~ 第一题&#xff1a; class Base1 { public: int _b1; }; class Base2 { public: int _b2; }; class Derive : public Base1, public Base2 { public: int _d; }; int main(){ Derive d; Base1* p1 &d; Base2* p2…