web类sql注入
关于sql注入的介绍
攻击者利用手工注入或者绕过防护程序进行sql注入得到数据泄露的效果
关键词注入绕过
关键词select,union,or,and,=,空格
常见的注入绕过方式
(1)编码绕过
将被过滤的关键词进行编码
一、URL编码
形式:“%”加上ASCII码(先将字符转换为两位ASCII码,再转为16进制),其中加号“+”在URL编码中和“%20”表示一样,均为空格。
当遇到非ASCII码表示的字符时,如中文,浏览器或通过编写URLEncode,根据UTF-8、GBK等编码16进制形式,进行转换。如“春”的UTF-8编码为E6 98 A5,因此其在支持UTF-8的情况下,URL编码为%E6%98%A5。值得注意的是采取不同的中文编码,会有不同的URL编码。
在URL传递到后台时,首先web容器会自动先对URL进行解析。容器解码时,会根据设置(如jsp中,会使用request.setCharacterEncoding("UTF-8")),采用UTF-8或GBK等其中一种编码进行解析。这时,程序无需自己再次解码,便可以获取参数(如使用request.getParameter(paramName))。
但是,有时从客户端提交的URL无法确定是何种编码,如果服务器选择的编码方式不匹配,则会造成中文乱码。为了解决这个问题,便出现了二次URLEncode的方法。在客户端对URL进行两次URLEncode,这样类似上文提到的%E6%98%A5则会编码为%25e6%2598%25a5,为纯ASCII码。Web容器在接到URL后,自动解析一次,因为不管容器使用何种编码进行解析,都支持ASCII码,不会出错。然后在通过编写程序对容器解析后的参数进行解码,便可正确得到参数。在这里,客户端的第一次编码,以及服务端的第二次解码,均是由程序员自己设定的,是可控的,可知的。
绕过:
有些waf并未对参数进行解码,而后面程序处理业务时会进行解码,因此可以通过二次url编码绕过。例如:
%253cscript%253ealert(1)%253c%252fscript%253e
二、Unicode编码
形式:“\u”或者是“%u”加上4位16进制Unicode码值。
Unicode编码可以在js中先被解析,再作为命令执行,而在html上下文中,unicode不会被解析,会直接作为字符串输出。
绕过:
(1)JavaScript的String.fromCharCode(numX),其中numX为Unicode值(十进制),此方法需和eval联合使用。例如:
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
(2)<script>标签中,可以直接先将\u转换为代码,再执行,例如:
<script>\u0061\u006C\u0065\u0072\u0074(1)</script>
三、HTML编码
形式:“&#”加上十进制、16进制的ASCII码或Unicode编码。
浏览器在根据HTML对网页进行渲染时,会先对html编码进行解析,然后再进行渲染,但是该html编码需在“值”当中,比如src属性的值,可用html表示,浏览器会正确解析,但如果src本身使用html编码,则会渲染出错。
绕过:
将属性值,用html编码表示,例如:
<img src=#οnerrοr="alert(2)">
(2)改变字母大小写
例如select改为SelEct
(3)加入无效字符
%00为经典的无效字符,在关键字中加入%00来绕过检查:sel%00ect
(4)内联注释绕过
/*!xxxxx */其中xxxxx为关键词
(5)等价函数替换绕过
在查到web屏蔽了什么之后,可以用相应的函数替代被屏蔽的函数
(6)利用关键字删除绕过
此种方法非常巧妙,将删除的关键词作为绕过的跳板
例如:我们可以输入sel+select+ect,利用删除关键词把关键词输入进去
(7)宽字节注入
等待增删,我暂时还没懂
(8)溢出绕过
输入一整串数据使得溢出
针对特殊字符的相应的解决方案
过滤逗号
union select 1,2,3 union select * from (select 1)a join (select 2)b join (select 3)
substr和mid()可以使用from for的方法解决 substr(str from pos for len) //在str中从第pos位截取len长的字符 mid(str from pos for len)//在str中从第pos位截取len长的字符 limit可以用offset的方法绕过 limit 1 offset 1 使用substring函数也可以绕过 substring(str from pos) //返回字符串str的第pos个字符,索引从1开始
过滤空格
(1)双空格 (2)/**/ (3)用括号绕过 (4)用回车代替 //ascii码为chr(13)&chr(10),url编码为%0d%0a
过滤等号
“=”==“like”
一些较为实用的东西
正常情况下的万能密码:
1'or'1'='1#
admin:1'or'1'='1
password:1'or'1'='1
相应的例题:
[极客大挑战 2019]EasySQL 1
从题给信息并经过简单注入之后,我们发现加#不能成功,尝试用burpsuite抓包,在改动两个密码之后得到flag
[SUCTF 2019]EasySQL 1
这道题是一道堆叠注入,不能直接进行sql,而要先输入1;后面加上该加的语句
首先加上了1;show database
查询表名发现了flag,于是尝试能否得到flag,发现不行;
抓包也被禁了,显示请求过快,只能借助wp
发现查询语言
select $post['query']||flag from Flag
然后输入*,1;
得到结果
类似的还有[极客大挑战 2019]LoveSQL 1
也是使用sql注入,主要是通过手动sql注入进行破解密码,同时,也用到了这个万能密码
lovesql
这道题其中有些很基础的函数要知道
当找到回显的时候,
group_concat(table_name) from information_schema.tables where table_schema=database()
group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='所查得到的表名'
group_concat(id,username,password) from l0ve1ysq1(这里可以换成很多东西) // id,username,password就是表名,看题中给的是什么
本文来自博客园,作者:逆世混沌,转载请注明原文链接:https://www.cnblogs.com/nish1hundun/p/15822951.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步