人间何所以,观风与月舒。|

逆世混沌

园龄:3年2个月粉丝:6关注:5

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就是表名,看题中给的是什么

 

posted @   逆世混沌  阅读(208)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 狂迪 卢广仲
狂迪 - 卢广仲
00:00 / 00:00
An audio error has occurred.

作词 : 卢广仲/討海人/黄少雍

作曲 : 卢广仲

在我眼前消失不见

今天的什么都不对

楼下的店听见熟悉的音乐

谁离开我谁爱着我

剩下一半的小火锅

别乱牵拖直到你出现

满天星光月亮出来了

神魂颠倒这是真的吗

管不住我自己的步伐

戒不掉你致命的魔法

谁教我蜿蜒的弹跳

谁教我崎岖的舞蹈

我爱你你知不知道

OH Dónde estás Bongria

想要见面有点抱歉

下午才跟你晚上约

请放轻松看着公园的落叶

摇摇晃晃我的形状

一边海洋一边天堂

你拉着我这一步叫做永远

满天星光月亮出来了

神魂颠倒这是真的吗

管不住我自己的步伐

戒不掉你致命的魔法

谁教我蜿蜒的弹跳

谁教我崎岖的舞蹈

我爱你你知不知道

OH Dónde estás Bongria

我丢掉太多的不必要

朝着有你的方向跑

跑到你眼前逗你笑

听到电影里的配乐响起

全场只为了等你说一句

说欸你要不要跟我一起

去教堂

Yes I do希望你也一样

先说好一起永保安康

每一天蜿蜒的弹跳

每一天崎岖的舞蹈

我爱你你知不知道 OH

如果爱我让我看见你

的脚