2023年6月21日发(作者:)
Sql注⼊详解:宽字节注⼊+⼆次注⼊sql注⼊漏洞原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放⼊到数据库引擎中执⾏了。攻击⽅式:(1) 权限较⼤时,直接写⼊webshell 或者直接执⾏系统命令(2) 权限较⼩时,通过注⼊获得管理员密码信息,或者修改数据库内容进⾏钓鱼等常出现的地⽅:登录页⾯、获取HTTP头(user-agent、client-ip等)、订单处理等,HTTP头⾥⾯client-ip 和 x-forward-for 常出现漏洞,在涉及购物车的地⽅,常发⽣⼆次注⼊;1、 普通注⼊指未做任何处理的,直接通过注⼊union 查询就可以注⼊的漏洞。在普通注⼊测试时,通过查找关键字定向挖掘,数据库操作:select from 、mysql_connect 、mysql_query 、mysql_fetch_row 等,数据库查询⽅式:update、insert、delete等2、 编码注⼊程序在进⾏⼀些操作之前,经常会进⾏⼀些编码处理,⽽做编码的函数也是存在问题的,通过输⼊转码函数不兼容的特殊字符,可以导致输出的字符变成有害的数据。常见的编码注⼊有mysql 宽字节以及urldecode/rawurldecode 函数导致的。(1) 宽字节注⼊在进⾏php 连接mysql 时,当设置”ser character_set_client=gbk” 时会导致⼀个编码转换的注⼊问题,也就是熟悉的宽字节注⼊,当存在宽字节注⼊时,%df%27 可把程序中过滤的 (%5c)吃掉。例如:/?id=1存在宽字节注⼊时,则:/?id=-1’and 1=1%23 单引号会被转义成 ’但是提交:/?id=-1%df’and 1=1%23 时,%df和 反斜杠(%5c) 组合%df%5c 编码后是⼀个汉字,这时候单引号依然存在,则会闭合成功,形成注⼊漏洞。形成原因:由于设置Mysql 服务器客户端数据编码是GBK ,set character_set_client=gbk执⾏语句时进⾏GBK 转码时形成攻击,通常都设置⽅法是: SET NAMES ‘gbk’,等同于:SETcharacter_set_connection=’gbk’,character_set_results=’gbk’,character_set_client=’gbk’此编码设计也存在漏洞,建议使⽤官⽅给的mysql_set_charset⽅式来设置编码,在调⽤SET NAMES 之后还记录了当前的编码,留着给后边mysql_real_escape_string处理字符时使⽤,后边合理的使⽤mysql_real_escape_string还是可以防御此漏洞的。防御⽅法:①在执⾏查询之前先执⾏SET NAMES ‘gbk’,character_set_client=binary 设置character_set_client 为 binary② 使⽤mysql_set_charset(‘gbk’) 设置编码,然后使⽤mysql_real_escape_string() 函数被参数过滤③使⽤pdo⽅式,在Php 5.3.6及以下版本中需要设置setAttribute(PDO:ATTR_EMULATE_PREPARES,false); 来禁⽤preparcd statements 的仿真效果。宽字节注⼊测试⽰例:Gbk编码格式输⼊结果:宽字节注⼊成功,%df’被过滤后成为%dr’,经过编码后成为%df%5c,即就是汉字“運”。因此,可以绕过,形成注⼊。(2) ⼆次urldecode 注⼊现在通常Web应⽤程序⼤多都会进⾏参数过滤,来防⽌注⼊。如果某处使⽤了urldecode或者 rawurldecode 函数,则会导致⼆次解码⽣成单引号⼆引发注⼊,即⼆次注⼊。Web应⽤程序通常使⽤addslashes() 、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC来防⽌注⼊,也就是给单引号(‘’)、双引号(“”)、反斜杠()和NULL加上反斜杠转义。⼆次注⼊测试代码:执⾏结果:原理:由于我们提交id参数到webserver时,webserver会⾃动解码⼀次,假设⽬标程序开启了GPC,我们提交参数id=1%2527 ,经过第⼀次解码后,%25解码结果为%,则参数为id=1%27,第⼆次程序使⽤了urldecode 或者 rawurldecode函数来解码id参数,则解码后结果为id=1’ ,这时单引号成功出现引发注⼊。3、 sql注⼊漏洞防范这⾥提供三种防御⽅法:预编译⽅式、过滤函数和类、魔术引号。(1)、预编译⽅式:在.NET语⾔中使⽤SqlParameter进⾏预编译⽅式处理数据库查询,在java中语⾔使⽤prepareStatement进⾏预编译处理数据库查询,在PHP中使⽤pdo 的prepare 进⾏预编译处理数据库查询;(2)、过滤函数和类:两种共使⽤场景。⼀种是程序⼊⼝统⼀过滤,像框架程序这种⽅式⽐较多,另⼀种是在程序进⾏SQL语句运⾏之前使⽤。PHP常使⽤的函数有addslashes()、mysql_escape_string()、msyql_real_string()、intval()函数等;(3)、魔术引号:通常数据污染的⽅式有两种:⼀种是应⽤被动接收参数,类似于GET、POST等;另⼀种是主动获取参数,类似与读取远程桌⾯页⾯或者⽂件内容等。在PHP中魔术引号配置⽅法,magic_quotes_gpc负责对GET、POST、COOKIE的值进⾏过滤,magic_quotes_runtime对数据库或者⽂件中获取的数据进⾏过滤。注:本⽂属于作者⾃⼰原创,转载请注明出处,若有错误之处,还请指出,谢谢!
2023年6月21日发(作者:)
Sql注⼊详解:宽字节注⼊+⼆次注⼊sql注⼊漏洞原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放⼊到数据库引擎中执⾏了。攻击⽅式:(1) 权限较⼤时,直接写⼊webshell 或者直接执⾏系统命令(2) 权限较⼩时,通过注⼊获得管理员密码信息,或者修改数据库内容进⾏钓鱼等常出现的地⽅:登录页⾯、获取HTTP头(user-agent、client-ip等)、订单处理等,HTTP头⾥⾯client-ip 和 x-forward-for 常出现漏洞,在涉及购物车的地⽅,常发⽣⼆次注⼊;1、 普通注⼊指未做任何处理的,直接通过注⼊union 查询就可以注⼊的漏洞。在普通注⼊测试时,通过查找关键字定向挖掘,数据库操作:select from 、mysql_connect 、mysql_query 、mysql_fetch_row 等,数据库查询⽅式:update、insert、delete等2、 编码注⼊程序在进⾏⼀些操作之前,经常会进⾏⼀些编码处理,⽽做编码的函数也是存在问题的,通过输⼊转码函数不兼容的特殊字符,可以导致输出的字符变成有害的数据。常见的编码注⼊有mysql 宽字节以及urldecode/rawurldecode 函数导致的。(1) 宽字节注⼊在进⾏php 连接mysql 时,当设置”ser character_set_client=gbk” 时会导致⼀个编码转换的注⼊问题,也就是熟悉的宽字节注⼊,当存在宽字节注⼊时,%df%27 可把程序中过滤的 (%5c)吃掉。例如:/?id=1存在宽字节注⼊时,则:/?id=-1’and 1=1%23 单引号会被转义成 ’但是提交:/?id=-1%df’and 1=1%23 时,%df和 反斜杠(%5c) 组合%df%5c 编码后是⼀个汉字,这时候单引号依然存在,则会闭合成功,形成注⼊漏洞。形成原因:由于设置Mysql 服务器客户端数据编码是GBK ,set character_set_client=gbk执⾏语句时进⾏GBK 转码时形成攻击,通常都设置⽅法是: SET NAMES ‘gbk’,等同于:SETcharacter_set_connection=’gbk’,character_set_results=’gbk’,character_set_client=’gbk’此编码设计也存在漏洞,建议使⽤官⽅给的mysql_set_charset⽅式来设置编码,在调⽤SET NAMES 之后还记录了当前的编码,留着给后边mysql_real_escape_string处理字符时使⽤,后边合理的使⽤mysql_real_escape_string还是可以防御此漏洞的。防御⽅法:①在执⾏查询之前先执⾏SET NAMES ‘gbk’,character_set_client=binary 设置character_set_client 为 binary② 使⽤mysql_set_charset(‘gbk’) 设置编码,然后使⽤mysql_real_escape_string() 函数被参数过滤③使⽤pdo⽅式,在Php 5.3.6及以下版本中需要设置setAttribute(PDO:ATTR_EMULATE_PREPARES,false); 来禁⽤preparcd statements 的仿真效果。宽字节注⼊测试⽰例:Gbk编码格式输⼊结果:宽字节注⼊成功,%df’被过滤后成为%dr’,经过编码后成为%df%5c,即就是汉字“運”。因此,可以绕过,形成注⼊。(2) ⼆次urldecode 注⼊现在通常Web应⽤程序⼤多都会进⾏参数过滤,来防⽌注⼊。如果某处使⽤了urldecode或者 rawurldecode 函数,则会导致⼆次解码⽣成单引号⼆引发注⼊,即⼆次注⼊。Web应⽤程序通常使⽤addslashes() 、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC来防⽌注⼊,也就是给单引号(‘’)、双引号(“”)、反斜杠()和NULL加上反斜杠转义。⼆次注⼊测试代码:执⾏结果:原理:由于我们提交id参数到webserver时,webserver会⾃动解码⼀次,假设⽬标程序开启了GPC,我们提交参数id=1%2527 ,经过第⼀次解码后,%25解码结果为%,则参数为id=1%27,第⼆次程序使⽤了urldecode 或者 rawurldecode函数来解码id参数,则解码后结果为id=1’ ,这时单引号成功出现引发注⼊。3、 sql注⼊漏洞防范这⾥提供三种防御⽅法:预编译⽅式、过滤函数和类、魔术引号。(1)、预编译⽅式:在.NET语⾔中使⽤SqlParameter进⾏预编译⽅式处理数据库查询,在java中语⾔使⽤prepareStatement进⾏预编译处理数据库查询,在PHP中使⽤pdo 的prepare 进⾏预编译处理数据库查询;(2)、过滤函数和类:两种共使⽤场景。⼀种是程序⼊⼝统⼀过滤,像框架程序这种⽅式⽐较多,另⼀种是在程序进⾏SQL语句运⾏之前使⽤。PHP常使⽤的函数有addslashes()、mysql_escape_string()、msyql_real_string()、intval()函数等;(3)、魔术引号:通常数据污染的⽅式有两种:⼀种是应⽤被动接收参数,类似于GET、POST等;另⼀种是主动获取参数,类似与读取远程桌⾯页⾯或者⽂件内容等。在PHP中魔术引号配置⽅法,magic_quotes_gpc负责对GET、POST、COOKIE的值进⾏过滤,magic_quotes_runtime对数据库或者⽂件中获取的数据进⾏过滤。注:本⽂属于作者⾃⼰原创,转载请注明出处,若有错误之处,还请指出,谢谢!
发布评论