API接口漏洞
一、概念
api ===> application interface 应用接口
向特定的接口发送一个请求包
返回一个类似于json格式的字符串
二、REST型web service
可以从网上去搜索下api接口去理解,下面有个我找到的网址,给出api接口的分类
https://blog.csdn.net/t79036912/article/details/127828263
常见的api接口是REST型web service,这里稍微说下
利用不同的http方法实现不一样的功能
全部都是将请求包发送到一个特定的url
只是请求方式不同
下面是根据理解,使用php写出来的类似于rest接口的代码
<?php
$method = $_SERVER['REQUEST_METHOD'];
$name = 'bihuo15';
switch($method){
case 'GET':
echo 'now the name is '.$name;
break;
case 'POST':
if(isset($_POST['name'])){
$name = $_POST['name'];
}
break;
case 'DELETE':
unset($name);
break;
}
三、搭建dvws靶场
dvws靶场不同于dvwa靶场,这个靶场是来测试api接口漏洞的
下载镜像
docker pull tssoffsec/dvws
启动镜像
docker run -d -p 80:80 -p 8080:8080 tssoffsec/dvws
必须修改/etc/hosts文件,将域名dvws.local设置进去,不然无法打开
然后需要点击setup,加载下数据库
四、使用BurpSuite抓取接口请求
因为要用burp,所以也需要修改win10环境的hosts文件,才能打开网站
我们先测试一下暴力破解模块,随便输入用户名aaa密码bbb,点击登录,使用burp抓取请求包
发现与正常网页的请求包不同,正常网页请求包要包含请求方式 请求路径 http版本号等
但是api接口的请求包,就是一串数据
这串数据像是json格式化的数据,值看起来像是base64编码后的值
所以很明显通过抓包就可以分辨出是否是api接口
我们看到上面写着WebSocket接口,这里是WebSocket API接口,它与REST接口的区别,可以参考下面文章
https://blog.csdn.net/lsx2017/article/details/105034038/
经过base64解码后,就是我们输入的用户名aaa
五、WebSocket API接口的暴力破解
上面抓取请求就测试的是暴力破解
可以看到有两个请求包构成,一个是发送到服务器端,一个是发送到客户端
这属于websocket 通信协议 全双工通信
同一时间 客户端和服务器端都可以同时发送数据
在burp代理的套接字历史也可以查看到
当我们不抓包,输入错误的账户密码的时候
页面上回显Incorrect username/password
这个信息与第二次请求包中信息一致,是从服务器端返回给客户端
当我们输入正确的账户admin密码admin的时候
页面上回显Welcome to your account. How are you Super Administrator?
证明登录成功
成功和失败的第二次请求包是不一样的,因此可以进行暴力破解
但是这里无法提交到intruder模块,无法进行暴力破解
我觉得这里可以写个python脚本,与burp联用,在调用密码字典文件,给密码字典文件里面的每一个值都进行base64编码,然后获取第二个请求包,当第二个请求包里面的值与其它测试的值不一致的时候,就是破解出的账户密码,然后打印出账号密码
或者有那种专门暴力破解api接口的工具,这里暂时没有进行暴力破解,知道如何进行就可以了
六、WebSocket API接口的命令执行
这个靶场的命令执行漏洞,写的需要ping一个ip地址
我们提供一个ip地址,然后抓包
从服务端返回给客户端的信息,成功显示ping 127.0.0.1的信息
放包之后,页面上也显示出来了
分析一下,如何进行命令执行,执行其它的命令,想要ping一个地址的话,输入的命令 ping 跟上 ip
那么我们可以这样构造,ping 127.0.0.1&&whoami
成功命令执行
七、WebSocket API接口的文件包含
先抓包
发送给服务器端的值是文件名
服务器端返回给客户端的值,就是文件的内容
我们修改文件名,改成/etc/shadow文件,然后发送给服务器
可以看到成功返回了shadow文件的信息,这里有时候也看权限,我们这里有信息,证明是root权限
八、WebSocket API接口的报错注入
也是先抓包
报错注入我们之前学过,常用的测试就是单双引号,我们先随便构造一个包含单双引号的参数,然后经过base64编码
之后进行api接口通信,看到服务端返回给客户端的信息是报错的信息
<pre>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"' and password='aaa'' at line 1</pre>
分析报错信息,去掉两边引用的单引号
看到双引号是我们写入的,所以是双引号报错
"' and password='aaa'
那么根据上述构造原sql语句
select * from xxx where username = ' aaa' and extractvalue(1,concat(0x7e,user()))-- 1 ' and password='aaa'
aaa' and extractvalue(1,concat(0x7e,user()))-- 1
然后将参数进行base64编码
再次测试,成功报错
九、WebSocket API接口的XSS漏洞
XSS与之前学的XSS漏洞没有什么区别,只不过这个是属于WebSocket API接口,所以下面就只演示了下XSS漏洞
1. 反射型XSS
2. 存储型XSS
十、在线网站测试WebSocket API接口的XSS漏洞
网址: https://portswigger.net/web-security
可以自己去挑战一下
有的会遇到那种ip被ban的情况,可以考虑在打开网页的时候抓个包,然后修改client-ip或者X-Forwarded-For,将ip修改为其它的任意ip,就可以绕过ip被封禁的限制了