对支付软件的漏洞利用
考点
- 安卓应用的简单逆向、反编译、patch、重打包
- 对安卓应用的通信流量进行抓取和分析
- XXE漏洞及其利用
思路
- 首先patch掉禁用注册的源码
- 通过git泄露获得服务端web源码
- 源码审计
- 通过xxe漏洞获得key
- 利用key伪造交易信息给自己充值
step1 获取到apk
首先我拿到了一款支付软件的安装包,我们先在模拟器中安装好这个软件,我们发现这里的注册按钮是无法使用的,如下图:
这时,我们要利用移动端逆向的知识,patch掉禁用注册按钮的的代码
工具:apktool
解包:apktool.bat d 文件命.apk 文件名
打包:apktool.bat b 文件名 文件命.apk
签名(必要)
if-nez vA, :cond_" 如果vA不等于0则跳转到:cond_
使用的三个软件都是免费的,下载地址Google一下也能轻易的搜到
apktool下载地址
dex2jar下载地址
jd-gui下载地址
重新打包后,我们在模拟器中安装好这个apk程序,运行他。
step2 了解程序,并下载web服务源码
一共是4个按钮,不同的按钮是有不同的用处,我们也了解到整个程序的使用是基于web服务的,根据上级给的IP地址,我们使用漏扫工具对其进行扫描,发现其存在git源码泄露漏洞,利用漏洞我们下载源码,一共是4个php页面。
step3 代码审计
因为平时一直从事re的题目,所以我将代码审计理解为逆向中的静态分析,简单的来说就是检查源代码中的安全缺陷,是否存在安全隐患。git源码泄露的php页面分别是:api.php,key.php,notify.php.index.php.
通过代码审计我们发现了,其中的核心代码是在notify.php,整个程序的流程是,充值,钱够数,买flag,而notify.php中就是充值的过程。
这里,我们看到了充值成功的信息,我们再向上看充值成功的条件是sign值为5个字符串拼接后md5加密。
step4 获取信息
appid是通过阅读可以得到的,“wx”
deposit的信息获取位于api.php中,显示的flag价格是9999999999
nonce_str是通过openssl函数计算,返回值为1
session_id是登录时,返回包中的信息,每次登录的时候都会改变
sign值是通过计算得来的,脚本如下
<?php
$key="668f4f4db2ac706137639bfc3ca70fe1";
$appid='wx';
$deposit="19999999999";
$nonce_str="1";
$session_id="9ang9ja5l7o7paicmi4j49q6ke";
$aa=$appid.$deposit.$nonce_str.$session_id.$key;
//echo $aa;
echo md5($aa);
?>
step5 xxe漏洞利用
libxml_disable_entity_loader(false)//为ture,则表示禁用外部实体
开启burp的拦截功能,然后访问该IP地址,当访问请求被burp拦截后,讲如下的XML文本直接卸载数据包内容的下面
<?xml version="1.0" encoding="ISO-8859-1"?> <xml> <appid>wx</appid> <deposit>19999999999</deposit> <nonce_str>1</nonce_str> <session_id>njorlgicrcr9j21bqp1n5f1jou</session_id> <sign>3cf7d98cac07de65bbc94d4f18c4798c</sign> </xml>
(对应XML中的标签)
将XML内容发送给服务器,服务器讲XML解析完成后,就会依照解析的内容工作,这段XML中的内容就被应用到了目标服务器下(192.168.32.187),服务器解析XML内容后,会将这一文件内容存入&xxe中,然后将数据返回给恶意访问者。
下面一些图片就是步骤的演示:
刚刚登陆后的界面如图
在burp中开启拦截,点击充值,出现界面如下图,session_id出现了,之后我们利用脚本求出sign值。
再点击充值,这个时候我们要将拦截的信息进行修改了。
关闭拦截,我们的余额发生了变化,这个时候就可以购买flag了
整个题目的过程就是这样,希望大家可以有所收获