DVWA-impossible代码审计

本篇文章针对于DVWA靶场的impossible级别进行代码审计,基于DVWA的每一个漏洞的impossible级别,从整体思路上出发,进行代码审计,最后对其总结。从中可以学习到一些漏洞的防御手法,并且对漏洞有更深入的理解。

文章目录

    • 暴力破解
      • 整体思路
      • 代码审计
      • 总结
    • 命令注入
      • 整体思路
      • 代码审计
      • 总结
    • CSRF
      • 整体思路
      • 代码审计
      • 总结
    • 文件包含
      • 整体思路
      • 代码审计
      • 总结
    • 文件上传
      • 整体思路
      • 代码审计
      • 总结
    • SQL注入
      • 整体思路
      • 代码审计
      • 总结
    • SQL盲注
      • 整体思路
      • 代码审计
      • 总结
    • 弱会话IDs
      • 整体思路
      • 代码审计
      • 总结
    • XSS-DOM
      • 整体思路
      • 代码审计
      • 总结
    • XSS-Reflect
      • 整体思路
      • 代码审计
      • 总结
    • XSS-Store
      • 整体思路
      • 代码审计
      • 总结
    • JavaScript Attacks
    • Insecure CAPTCHA
      • 整体思路
      • 代码审计
      • 总结
    • DVWA代码审计总结

暴力破解

整体思路

注意:一切sql执行都使用预编译。

  • 首先通过token令牌校验,防止CSRF攻击
  • 对用户传入的数据做好消毒处理
  • 定义防御规则:登录失败次数,用户锁定时间,用户是否锁定
  • 先查询用户登录信息,判断用户是否被锁定
  • 用户没被锁定,才使用预编译sql校验用户与密码
  • 如果登录成功,就更新用户登录失败次数为0,并且继续登录成功的逻辑
  • 如果登录失败,就增加用户登录失败次数,只能在过了锁定时间之后才能再次登录
  • 最后都要更新用户最后登录的时间

代码审计

  1. token校验

    使用checkToken()函数进行校验防止CSRF

    image-20230928151720373

  2. 数据消毒:对username与password进行过滤

    使用stripslashes()函数删除数据的反斜杠,mysqli_real_escape_string()函数对输入的数据进行过滤,如果遇到特殊符号就进行转义,防止sql注入

    image-20230928151531440

  3. 定义登录失败限制次数,上锁时间,账户锁定状态

    image-20230928151901221

  4. 预编译获取用户登录信息

    image-20230928152008652

  5. 检查登录用户,判断失败登录次数是否大于规则定义的失败次数,如果大于,并且锁定时间还没到,那就上锁,否则就不锁定。

    image-20230928153319421

  6. 预编译查询,匹配用户名密码

    image-20230928152330639

  7. 判断用户是否符合登录条件

    image-20230928153521629

  8. 登录失败,添加登录失败次数

    image-20230928153622272

总结

暴力破解的impossible级别,

在代码语法上,主要使用了token校验防止CSRF攻击,并且对于一起sql语句都使用预编译的方式执行。

在代码逻辑上添加了登录规则,失败登录次数,用户锁定规则。

命令注入

整体思路

  • token校验防止CSRF攻击
  • stripslashes()函数对数据消毒
  • 通过点分割,在程序中对IP进行拼接
  • 通过php_uname来区分操作系统
  • 通过shell_exec()对不同的操作系统执行不同的ping命令

代码审计

  1. token校验,防止CSRF攻击

    image-20230928161348091

  2. 数据消毒,使用stripslashes()函数将用户输入的数据消除反斜杠,使用explode()函数,以点作为分隔符分割数组

    image-20230928161412515

  3. 筛选数据,使用shell_exec()函数进行ping命令执行

    通过is_numeric()函数来判断用户输入的数据是否是IP

    php_uname( ‘s’ )函数来获取操作系统名称

    stristr() 函数搜索字符串在另一字符串中的第一次出现,判断windows NT 是否出现在操作系统的名称描述中

    shell_exec()函数,用户执行命令,并返回执行结果,如果命令执行错误,将会返回NULL,与exec()函数相比,shell_exec()返回值更详细,因为exec()返回值是执行结果的最后一行,不过他和shell_exec()函数一样,如果命令执行错误,也返回NULL。

    image-20230928162032150

总结

命令注入的impossible级别:

在代码语法上,加入token校验。

在逻辑上对数据进行消毒,然后借助程序来拼接有效IP,从而防止用户输入的非法数据被执行。

CSRF

整体思路

  • token校验
  • 数据消毒
  • 二次认证

代码审计

  1. token校验,防止CSRF攻击

    image-20230928170412188

  2. 获取用户输入的数据,其中会让用户输入当前密码,进行二次校验,有效提高了CSRF利用难度

    image-20230928170547133

  3. 数据消毒。通过stripslashes()函数将数据的反斜杠删除,通过mysqli_real_escape_string()函数,对数据的特殊符号进行转义。

    image-20230928170720320

  4. 校验当前旧密码

    image-20230928170810968

  5. 对确认密码进行校验

    image-20230928170851156

总结

CSRF的impossible级别

防御分两步:

添加token校验:让客户端每次发起修改密码请求的时候都要携带服务端返回的token,这样就能有效避免攻击者伪造这个修改密码的请求,以为攻击者是无法获取服务端响应的token值的

二次校验:想要修改密码,就必须先输入旧密码,这样能加大攻击者伪造请求的难度,如果攻击者不知道密码,就无法完成请求伪造。

文件包含

整体思路

  • 文件包含可能导致信息泄露,恶意文件执行
  • 所以在符合业务的场景下,通过白名单的手段,规定只能包含服务器特定文件

代码审计

  1. 通过if来限制包含文件,只能包含服务器中特定的文件,类似于白名单限制,如果包含的文件不是规定的文件,则程序会输出错误

image-20230928173852853

总结

文件包含的impossible级别。

通过指定可以包含的文件,达到白名单的限制效果

防止了攻击者使用file协议,相对路径来包含服务器敏感文件,比如日志等信息,也能防止攻击者使用http协议,https协议让服务器包含恶意的文件。

文件上传

整体思路

  • 文件上传需要确定上传的路径,因此要定义文件的上传路径
  • 文件的名字使用随机的唯一id,从而让攻击者无法获取到图片位置信息,无法访问
  • 使用白名单的方式判断文件是否合法
  • 通过getimagesize()函数判断是否是真的图片,底层是利用文件头来判断的
  • 二次渲染,避免图片马,防止了程序的其他漏洞利用导致图片马被解析执行,比如文件解析漏洞,文件包含漏洞:通过imagecreatefromjpeg()等函数重新生成新的图片

代码审计

核心函数解释:

  • strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。此函数是区分大小写的,与strripos()函数相反,strripos()函数不区分大小写

  • sys_get_temp_dir() :返回临时文件路径

  • ini_get(): 获取一个配置选项的值,成功是返回配置选项值的字符串,null 的值则返回空字符串。如果配置选项不存在,将会返回 FALSE

  • uniqid() :基于以微秒计的当前时间,生成一个唯一的 ID

  • getimagesize():是PHP中用于获取图像的大小和格式的函数,底层利用文件头来判断文件类型。它可以返回一个包含图像的宽度、高度、类型和MIME类型的数组。可以从本地获取,也可以从远程获取。如果目标地址是图片,就会返回数组,否则返回FALSE并产生一条 E_WARNING 级的错误信息。

  • imagecreatefromjpeg() 函数用于从 JPEG 文件或 URL 创建一个新图象,将新图像放入内存中,后面需要通过imagedestroy()函数释放内存中的图像资源

  • imagejpeg()

    1、imagejpeg()函数是php图像处理中的一个重要函数,用于将图像保存为jpeg格式文件。

    2、imagejpeg()函数的语法如下:

    bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )
    

    其中, i m a g e 是图像资源, image是图像资源, image是图像资源,filename是保存的文件名,$quality是保存质量,取值范围从0-100,默认为75。

  • imagedestroy():释放内存中的图像资源

  • getcwd():获取当前目录

  • rename():函数用于重命名文件或目录,可以用于移动文件

    语法:

    bool rename ( string $source , string $target )
    

    参数:

    • $source:必需,表示源文件或目录的名称。
    • $target:必需,表示目标文件或目录的名称。

    返回值:
    在成功时返回TRUE,失败时返回FALSE。

  • file_exists():检查文件或目录是否存在

  • unlink():删除文件

  1. token校验

    image-20230928195246353

  2. 获取上传的文件对象信息

    其中通过strrpos()函数获取最后一个点的位置,并使用substr()函数截取,最终获得上传的文件后缀

    image-20230928195827031

  3. 定义文件上传目标路径

    sys_get_temp_dir()返回临时文件路径,ini_get()从php的配置文件中获得临时文件路径

    image-20230928200322026

  4. 判断文件是否合法,并二次生成图片到内存中,使用imagejpeg()将图片保存到临时文件中

    image-20230928200707211

  5. 移动临时文件到目标路径

    image-20230928201228579

总结

文件上传impossible级别。

代码逻辑:

通过白名单的形式来限制文件上传的类型,然后利用getimagesize()函数判断上传的文件是否是真的图片,并且使用imagecreatefromjpeg()函数基于原来的图像创建一个新图像存到内存中,从而防止图片马的上传,然后用imagejpeg()将内存中的图片保存到临时文件。

总的来说通过白名单严格限制了上传文件类型,然后通过二次渲染防止了图片马,避免程序中出现的文件包含漏洞或者文件解析漏洞对图片马进行解析执行。

SQL注入

整体思路

  • 通过is_numeric()函数,判断用户传参是否为数字,是的话才进行查询
  • 使用预编译的方式,执行sql
  • 确保执行sql返回的结果为1才会返回数据

代码审计

image-20230928212116952

总结

sql注入的防御,主要是对参数进行过滤,在这个靶场中,id为数值,所以使用了is_numeric()函数对传的参数进行了校验。

sql语句的执行使用prepare函数,进行预编译处理,能有效的防止sql注入

最后取数据的时候,确保sql查询结果为1条数据,才返回数据,如果多条数据,就不返回。

SQL盲注

整体思路

  • token校验
  • 参数校验,只有数字才会进行数据库查询逻辑
  • sql查询时使用预编译

代码审计

  1. token校验,防止CSRF攻击

    image-20230929134229128

  2. 参数校验,确保参数是数字类型才会执行,才会进入sql语句执行的逻辑,sql执行需要经过预编译处理

    image-20230929134319658

总结

SQL盲注的impossible级别。

SQL盲注和普通的SQL注入的防御差不多。

都是先token校验,然后进行参数校验,对sql语句执行前进行预编译处理,从而能完全避免sql注入。

弱会话IDs

整体思路

cookie是用户登录凭证,cookie泄露之后,可以让攻击者越权访问程序,然而cookie是由服务端设置给客户端的,如果设置的cookie有规律,就会被攻击者猜测cookie,从而绕过登录

所以生成cookie的方式需要复杂,不易猜测。

这里就使用了mt_rand()函数,随机生成字符串并且使用time()函数生成时间戳,与字符串 impossible进行拼接,拼接好之后使用sha1()函数进行加密,从而让攻击者无法猜测到session值,从而无法越权访问。

代码审计

$cookie_value采用随机数+时间戳+固定字符串"Impossible",再进行sha1运算,完全不能猜测到dvwaSession的值

image-20230929141158357

总结

弱会话IDs 的 impossible级别。

为了防止攻击者获得cookie用户凭证。

所以服务器需要设置足够复杂的cookie。

可以使用随机数,加上sha1加密,让攻击者无法猜测cookie,从而无法越权访问应用程序。

XSS-DOM

整体思路

XSS-DOM类型的特点就是客户端调用了document对象,能够动态更新网页。DOM型从效果上来说也属于反射型XSS,是通过修改页面的DOM节点形成的XSS。在 HTML DOM (Document Object Model) 中 , 每一个元素都是 节点

只要对用户在url中输入的内容不做解码,让内容直接显示在网页中,就不会被JS解析。

代码审计

服务端没有代码,主要是在客户端处理,看到如下源代码,由于我们在url中输入的任何符号,都会被url编码,以下源代码在渲染我们输入的值的时候,因为没有进行解码,所以即使我们输入了xss注入的攻击代码,也无法被客户端执行。

image-20230929144545768

总结

DOM型XSS从效果上看属于反射型。

在这个靶场中,我们是通过url注入xss代码的,所以我们的特殊符号会自动编码为url编码,

如果客户端对用户的输入不做解码,将会以url编码的形式展示在网页中,从而不会被JS执行导致XSS攻击。

XSS-Reflect

整体思路

使用htmlspecialchars()函数,将预定义字符转为HTML实体,防止浏览器将特殊符号作为HTML元素,而仅仅是将它作为字符串,从而不会影响标签结构,就不会被JS解析。

代码审计

htmlspecialchars()这个函数的的功能:是把预定义的字符&、"、'、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。这种做法可以直接避免XSS攻击

image-20230929150252876

总结

htmlspecialchars()函数可以完全避免XSS注入。

XSS-Store

整体思路

  • 数据消毒
  • 将输入的数据变为HTML实体
  • 数据库操作使用预编译处理

代码审计

  1. token校验,防止CSRF攻击

    image-20230929151127040

  2. 数据消毒

    使用htmlspecialchars()将输入转为HTML实体

    使用stripslashes()函数过滤反斜杠,mysqli_real_escape_string()函数对特殊符号进行转义

    image-20230929151313515

  3. 对数据库操作进行预编译处理

    通过prepare与占位符,进行预编译处理数据库操作

    image-20230929151442595

总结

对于存储型XSS,和其他两种类型的相同点就是使用htmlspecialchars()函数将输入的内容转为HTML实体,将一些预定义的符号当做字符串处理。

由于存储型XSS涉及到了数据库操作,为了保证数据库安全,防止SQL注入,所以需要对数据库的操作进行预编译处理。

JavaScript Attacks

JS攻击级别

​ 在前几个级别中,都是对前端暴露出的JS代码进行分析,在hign级别中出现了JS混淆,可以通过这个网站:http://deobfuscatejavascript.com/#将混淆的js代码进行处理,还原为正常的js代码。

​ 由于JS是在客户端的,如果攻击者看了JS源码之后,理解了其中的代码逻辑,如果具有漏洞的话,就可以通过控制台去执行JS代码中的函数,从而达到利用目的。因此对于JS攻击,理论上是没有impossible级别的。

impossible级别

参考链接:https://blog.csdn.net/Sheng_GuoFu/article/details/128651797

image-20230929155531402

大致意思就是:你永远不能相信来自用户的任何输入,而且必须对此做出防备,但你又不能阻止用户的输入,因为这样可能会干扰网站的正常使用,所以压根就不存在Impossible级别。

Insecure CAPTCHA

整体思路

  • token校验,预防CSRF攻击
  • 验证逻辑不进行分步验证,一步验证到位,防止直接跳步绕过验证
  • 要求输入旧密码,进行二次校验,预防CSRF等攻击

代码审计

  1. token校验,防止CSRF攻击

    image-20230929165715133

  2. 数据消毒

    stripslashes()去除反斜杠,mysqli_real_escape_string()给预定义符号转义

    image-20230929165738945

  3. 检查验证码

    image-20230929165830559

  4. 判断验证码是否失败

    image-20230929165855015

  5. 旧密码校验,更新密码

    image-20230929170029986

总结

不安全的验证码impossible级别。

主要是防止攻击者绕过校验,一般出现的都是逻辑漏洞。

在这个级别中,取消了分步校验的逻辑。

通过二次校验,检查旧密码输入的是否正确,防止CSRF,近源等攻击。

校验要修改的密码与确认密码。

DVWA代码审计总结

​ 通过对DVWA靶场impossible级别的代码审计,发现大多数防御措施有很多共性。都使用了token校验,从根本上防止了CSRF攻击。

​ 在逻辑处理之前,都会对数据进行消毒,其中的常用函数是stripslashes(),删除字符串中的反斜杠,mysqli_real_escape_string()函数对特殊符号进行转义。或者做白名单限制,遇到需要与数据库交互的逻辑,都会使用预编译处理。

​ 如果在业务中,具有将用户的数据回显到浏览器的场景,大概率会使用到htmlspecialchars()函数,将输入转为HTML实体,从根源上阻止了XSS攻击。

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

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

相关文章

led台灯哪个牌子最好?2022最新的台灯牌子排名

想要选好护眼台灯首先我们要知道什么是护眼台灯&#xff0c;大的方向来看&#xff0c;护眼台灯就是可以保护视力的台灯&#xff0c;深入些讲就是具备让灯发出接近自然光特性的光线&#xff0c;同时光线不会伤害人眼而出现造成眼部不适甚至是视力降低的照明设备。 从细节上看就…

Linux——补充点(页表映射及LWP)

目录 补充点1&#xff1a;进程地址空间堆区管理 补充点2&#xff1a;Linux内核进程上下文切换 补充点3&#xff1a;页表映射 补充点4&#xff1a;两级页表 补充点1&#xff1a;进程地址空间堆区管理 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程&#…

【Java 进阶篇】MySQL多表查询之外连接详解

在MySQL数据库中&#xff0c;多表查询是一种常见且强大的功能&#xff0c;允许您在多个表之间执行联接操作&#xff0c;从而检索、过滤和组合数据。在本篇博客中&#xff0c;我们将深入探讨多表查询的一种类型&#xff0c;即外连接&#xff08;Outer Join&#xff09;&#xff…

医疗小程序开发:技术门槛高?

随着移动互联网的普及&#xff0c;医疗行业也逐渐转向线上。医疗小程序开发成为了很多企业和医疗机构关注的焦点。但是&#xff0c;对于一些技术小白来说&#xff0c;可能会觉得医疗小程序开发技术门槛高&#xff0c;无从下手。实际上&#xff0c;使用乔拓云平台进入后台&#…

C理解(一):内存与位操作

本文主要探讨C语言的内存和为操作操作相关知识。 冯诺依曼结构和哈佛结构 冯诺依曼结构&#xff1a;数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是&#xff1a;数据和代码分开存放,安全性高,读取和修麻烦 内存 内存是用来存储全局变量、局…

Prometheus+Grafana监控K8S集群(基于K8S环境部署)

文章目录 一、环境信息二、部署前准备工作三、部署Prometheus监控系统四、部署Node_exporter组件五、部署Kube_state_metrics组件六、部署Grafana可视化平台七、Grafana可视化显示Prometheus收集数据八、Grafana添加监控模板九、拓展 一、环境信息 1、服务器及K8S版本信息&…

Nim游戏

891. Nim游戏 - AcWing题库 全部异或起来&#xff0c;如果不为零&#xff0c;则可以一步使其变为0&#xff1a; 设异或和为x&#xff0c;x的最高位为第k位&#xff0c;令第k位为1的a[i]变为a[i]^x&#xff0c;a[i]^x < a[i]&#xff0c;这样就可以使异或和为0。 如此往复最…

目标检测如何演变:从区域提议和 Haar 级联到零样本技术

目录 一、说明 二、目标检测路线图 2.1 路线图&#xff08;一般&#xff09; 2.2 路线图&#xff08;更传统的方法&#xff09; 2.3 路线图&#xff08;深度学习方法&#xff09; 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…

el-table实现穿梭功能

第一种 <template><el-row :gutter"20"><el-col :span"10"><!-- 搜索 --><div class"search-bg"><YcSearchInput title"手机号" v-model"search.phone" /><div class"search-s…

EasyX趣味化编程note2,绘制基本图形

创意化编程&#xff0c;让编程更有趣 今天介绍的仍为比较简单的效果&#xff0c;由浅入深来进行学习 介绍每个函数都会附上代码和运行结果&#xff0c;感兴趣的大家可以复制粘贴运行一下看看效果&#xff0c;也可以自己进行改动&#xff0c;非常好玩且加深印象。 上节课的知识…

idea Springboot在线商城系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 在线商城系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有 完整的源代码和数据库&…

机器学习笔记:Huber Loss smooth L1 loss

1 Huber loss 1.1 介绍 Huber Loss是回归问题中的一种损失函数&#xff0c;它结合了均方误差MSE和绝对误差MAE的特点。 Huber Loss在误差较小的时候是平方损失&#xff0c;而在误差较大的时候是线性损失。因此&#xff0c;它在处理有噪声的数据时&#xff0c;尤其是存在离群点…

手机搜狗输入法,输入拼音时如何分割拼音,调出“分词“功能,如何微信或QQ使用发送按钮而不是换行?

背景 有时候打字&#xff0c;输入 “xian” 的时候我们的意图是 “xi’an” &#xff08;西安&#xff09;&#xff0c;或者输入 “yue” 的时候希望是 “yu’e”&#xff08;余额&#xff09; 如何输入这个分隔符 ’ 呢&#xff1f; 设置方法 默认页面如图 希望设置成 点…

家电行业 EDI:Miele EDI 需求分析

Miele是一家创立于1899年的德国公司&#xff0c;以其卓越的工程技术和不懈的创新精神而闻名于世。作为全球领先的家电制造商&#xff0c;Miele的经营范围覆盖了厨房、洗衣和清洁领域&#xff0c;致力于提供高品质、可持续和智能化的家电产品。公司的使命是为全球消费者创造更美…

【Java 进阶篇】深入理解 SQL 聚合函数

在 SQL 数据库中&#xff0c;聚合函数是一组强大的工具&#xff0c;用于处理和分析数据。它们可以帮助您对数据进行统计、计算总和、平均值、最大值、最小值等操作。无论您是数据库开发者、数据分析师还是希望更好地了解 SQL 数据库的用户&#xff0c;了解聚合函数都是非常重要…

CSS详细基础(四)显示模式

本帖开始介绍CSS中更复杂的内容 目录 一.显示模式 1.行内元素 2.块级元素 3.行内块元素 二.背景样式 一.显示模式 顾名思义&#xff0c;在CSS中&#xff0c;元素主要有3种显示模式&#xff1a;行内元素、块级元素、行内块元素~ 所谓块级元素&#xff0c;指的是该元素在…

ChatGPT AIGC 非常实用的AI工具集合大全

实战AI 工具箱 AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu

GD32工程创建

1.创建空工程 在任意路径下创建空的test文件夹。打开keil5空工程创建空工程 选择对应的芯片型号&#xff1a; 然后把空工程保存到test文件夹下。会自动生成如下文件。 2. 添加组 下载GD32F10X的固件库&#xff1a;在百度里搜索GD32进入官网。 下载下来对应的文件如下&#xff…

MYSQL常用命令

一.数据类型 MySQL中有多种数据类型&#xff0c;每种类型用于存储不同类型的数据。以下是MySQL中常见的数据类型&#xff1a; 数值类型&#xff1a; INT&#xff1a;整数类型&#xff0c;存储范围为-2,147,483,648到2,147,483,647。BIGINT&#xff1a;大整数类型&#xff0c;存…

【蓝桥杯选拔赛真题63】Scratch云朵降雨 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch云朵降雨 一、题目要求 编程实现 二、案例分析 1、角色分析