发布网友 发布时间:2022-04-22 08:59
共3个回答
懂视网 时间:2022-05-01 22:48
SQL语句是SELECT * FROM news WHERE tid=‘{$id}‘,就是根据文章的id把文章从news表中取出来。
在这个sql语句前面,我们使用了一个addslashes函数,将$id的值转义。这是通常cms中对sql注入进行的操作,只要我们的输入参数在单引号中,就逃逸不出单引号的,无法注入,如下图:
那么怎么逃过addslashes的?众所周知addslashes函数产生的效果就是,让’变成’,让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的:
1.想办法给前面再加一个\(或单数个即可),变成\’,这样被转义了,’逃出了 2.想办法把弄没有。
我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。如果我们输入%df’看会怎样:
我们可以看到,已经报错了。我们看到报错,说明sql语句出错,看到出错说明可以注入了。
为什么从刚才到现在,只是在’也就是%27前面加了一个%df就报错了?而且从图中可以看到,报错的原因就是多了一个单引号,而单引号前面的反斜杠不见了。
这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的也就是%5c变成了一个汉字“運”,而’逃逸了出来。
因为两个字节代表一个汉字,所以我们可以试试“%df%df%27”:
不报错了。因为%df%df是一个汉字,%5c%27不是汉字,仍然是’。
那么mysql怎么判断一个字符是不是汉字,根据gbk编码,第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以:
%a1%5c他可能不是汉字,但一定会被mysql认为是一个宽字符,就能够让后面的%27逃逸了出来。
于是我可以构造一个exp出来,查询管理员账号密码:
0×02 GB2312与GBK的不同
曾经有一个问题一直困扰我很久。
gb2312和gbk应该都是宽字节家族的一员。但我们来做个小实验。把phithon内容管理系统中set names修改成gb2312:
结果就是不能注入了:
有些同学不信的话,也可以把数据库编码也改成gb2312,也是不成功的。
为什么,这归结于gb2312编码的取值范围。它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE,而是0x5c,是不在低位范围中的。所以,0x5c根本不是gb2312中的编码,所以自然也是不会被吃掉的。
所以,把这个思路扩展到世界上所有多字节编码,我们可以这样认为:只要低位的范围中含有0x5c的编码,就可以进行宽字符注入。
0×03 mysql_real_escape_string解决问题?
部分cms对宽字节注入有所了解,于是寻求解决方案。在php文档中,大家会发现一个函数,mysql_real_escape_string,文档里说了,考虑到连接的当前字符集。
于是,有的cms就把addslashes替换成mysql_real_escape_string,来抵御宽字符注入。我们继续做试验,phithon内容管理系统v1.2:,就用mysql_real_escape_string来过滤输入:
我们来试试能不能注入:
一样没压力注入。为什么,明明我用了mysql_real_escape_string,但却仍然不能抵御宽字符注入。
原因就是,你没有指定php连接mysql的字符集。我们需要在执行sql语句之前调用一下mysql_set_charset函数,设置当前连接的字符集为gbk。
就可以避免这个问题了:
在3中我们说到了一种修复方法,就是先调用mysql_set_charset函数设置连接所使用的字符集为gbk,再调用mysql_real_escape_string来过滤用户输入。
这个方式是可行的,但有部分老的cms,在多处使用addslashes来过滤字符串,我们不可能去一个一个把addslashes都修改成mysql_real_escape_string。我们第二个解决方案就是,将character_set_client设置为binary(二进制)。
只需在所有sql语句前指定一下连接的形式是二进制:
mysql_query("SET character_set_connection=gbk, character_set_results=gbk,character_set_client=binary", $conn);
这几个变量是什么意思?
当我们的mysql接受到客户端的数据后,会认为他的编码是character_set_client,然后会将之将换成character_set_connection的编码,然后进入具体表和字段后,再转换成字段对应的编码。
然后,当查询结果产生后,会从表和字段的编码,转换成character_set_results编码,返回给客户端。
所以,我们将character_set_client设置成binary,就不存在宽字节或多字节的问题了,所有数据以二进制的形式传递,就能有效避免宽字符注入。
比如,我们的phithon内容管理系统v2.0版本更新如下:
已经不能够注入了:
在我审计过的代码中,大部分cms是以这样的方式来避免宽字符注入的。这个方法可以说是有效的,但如果开发者画蛇添足地增加一些东西,会让之前的努力前功尽弃。
很多cms,不止一个,我就不提名字了,他们的gbk版本都存在因为字符编码造成的注入。但有的同学说,自己测试了这些cms的宽字符注入,没有效果呢,难道是自己姿势不对?
当然不是。实际上,这一章说的已经不再是宽字符注入了,因为问题并不是出在mysql上,而是出在php中了。
很多cms(真的很多哦,不信大家自己网上找找)会将接收到数据,调用这样一个函数,转换其编码:
iconv(‘utf-8’, ‘gbk’, $_GET[‘word’]);
目的一般是为了避免乱码,特别是在搜索框的位置。
比如我们的phithon内容管理系统v3.0
我们可以看到,它在sql语句执行前,将character_set_client设置成了binary,所以可以避免宽字符注入的问题。但之后其调用了iconv将已经过滤过的参数$id给转换了一下。
那我们来试试此时能不能注入:
居然报错了。说明可以注入。而我只是输入了一个“錦'”。这是什么原因?
我们来分析一下。“錦”这个字,它的utf-8编码是0xe98ca6,它的gbk编码是0xe55c。
有的同学可能就领悟了。的ascii码正是5c。那么,当我们的錦被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的’被addslashes变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是\,正好把反斜杠转义了,导致’逃逸出单引号,产生注入。
这正利用了我之前说的,绕过addslashes的两种方式的第一种:将转义掉。
那么,如果我是用iconv将gbk转换成utf-8呢?
我们来试试:
果然又成功了。这次直接用宽字符注入的姿势来的,但实际上问题出在php而不是mysql。我们知道一个gbk汉字2字节,utf-8汉字3字节,如果我们把gbk转换成utf-8,则php会每两个字节一转换。所以,如果’前面的字符是奇数的话,势必会吞掉\,’逃出。
那么为什么之前utf-8转换成gbk的时候,没有使用这个姿势?
这跟utf-8的规则有关,UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
从2我们可以看到,对于多字节的符号,其第2、3、4字节的前两位都是10,也就是说,(0x0000005c)不会出现在utf-8编码中,所以utf-8转换成gbk时,如果有则php会报错:
但因为gbk编码中包含了,所以仍然可以利用,只是利用方式不同罢了。
总而言之,在我们处理了mysql的宽字符注入以后,也别认为就可以高枕无忧了。调用iconv时千万要小心,避免出现不必要的麻烦。
在逐渐国际化的今天,推行utf-8编码是大趋势。如果就安全性来说的话,我也觉得使用utf-8编码能够避免很多多字节造成的问题。
不光是gbk,我只是习惯性地把gbk作为一个典型的例子在文中与大家说明。世界上的多字节编码有很多,特别是韩国、日本及一些非英语国家的cms,都可能存在由字符编码造成的安全问题,大家应该有扩展性的思维。
总结一下全文中提到的由字符编码引发的安全问题及其解决方案:
1.gbk编码造成的宽字符注入问题,解决方法是设置character_set_client=binary。 2.矫正人们对于mysql_real_escape_string的误解,单独调用set name=gbk和mysql_real_escape_string是无法避免宽字符注入问题的。还得调用mysql_set_charset来设置一下字符集。 3.谨慎使用iconv来转换字符串编码,很容易出现问题。只要我们把前端html/js/css所有编码设置成gbk,mysql/php编码设置成gbk,就不会出现乱码问题。不用画蛇添足地去调用iconv转换编码,造成不必要的麻烦。
这篇文章是我对于自己白盒审计经验的一点小总结,但自己确实在很多方面存在欠缺,文中所提到的姿势难免存在纰漏和错误,希望有相同爱好的同学能与我指出,共同进步。
这篇文章不像上篇xss的,能够举出很多0day实例来论证宽字符造成的危害。原因有二:
1.宽字符问题确实不如富文本xss那么普遍,gbk编码的cms所占的比例也比较小,怪我才疏学浅,并不能每一章都找到相应的实例。 ??2.注入的危害比xss大得多,如果作为0day发出来,影响很坏。但我确实在写文章以及以前的审计过程中找到不少cms存在的编码问题。
所以我用实验的形式,自己写了的php小文件,给大家作为例子,希望不会因为例证的不足,影响大家学习的效果。
例子php文件和sql文件打包下载:
链接:http://pan.baidu.com/s/1eQmUArw 提取密码:75tu
本文PDF版本:链接: http://pan.baidu.com/s/1eprLs 密码: yoyw
浅析白盒审计中的字符编码及SQL注入
标签:asc amp bin gic http 第一个 name head 宽字节注入
热心网友 时间:2022-05-01 19:56
36条网络安全术语盘点
以下的网络安全常用术语,你都清楚吗?
01肉鸡
被黑客入侵并被长期驻扎的计算机或服务器。
02抓鸡
利用使用量大的程序的漏洞,使用自动化方式获取肉鸡的行为。
03webshell
通过web入侵的一种脚本工具,可以据此对网站服务进行一定程度的控制。
04一句话木马
通过向服务器提交一句简短的代码,配合本地客户端实现webshell功能的木马。
05提权
操作系统低权限的账户将自己提升为管理员权限使用的方法。
06后门
黑客为了对主机进行长期的控制,在机器上种植的一段程序或留下的一个入口。
07跳板
使用肉鸡IP来实施攻击其他目标,以便更好的隐藏自己的身份信息。
08旁站入侵
即同服务器下的网站入侵。
090day 漏洞 和 0day 攻击
0day 漏洞,又称零日漏洞 「zero-day」。是已经被发现 (有可能未被公开),而官方还没有相关补丁的漏洞。 利用0day漏洞的攻击行为即为0day攻击。
10CVE
CVE 的英文全称是 「Common Vulnerabilities & Exposures」 公共漏洞和暴露,例如 CVE-2015-0057、CVE-1999-0001 等等。CVE 就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。
11PoC
你可以理解成为漏洞验证程序。和一些应用程序相比,PoC 是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码。
12Exp
漏洞利用程序。简单讲就是一段可以发挥漏洞价值的程序,可以用过漏洞拿到目标机器的权限。
13SSL
安全套接字层(SSL, Secure Sockets Layer)是一种协议,支持服务通过网络进行通信而不损害安全性。
14APT攻击
高级持续性攻击,也称为定向威胁攻击,指某组织对特定对象展开的持续有效的攻击活动。这种攻击活动具有极强的隐蔽性和针对性,通常会运用受感染的各种介质、供应链和社会工程学等多种手段实施先进的、持久的且有效的威胁和攻击。
15旁注
旁注是一种入侵方法,利用同一主机上面不同网站的漏洞得到webshell,从而利用主机上的程序或者是服务所暴露的用户所在的物理路径进行入侵。
16免杀
就是通过加壳、加密、修改特征码、加花指令等等技术来修改程序,使其逃过杀毒软件的查杀。
17红蓝对抗
网络安全中,红蓝对抗是一方扮演黑客(蓝军),一方扮演防御者(红军),进行网络安全的攻防对抗。
18Payload
Payload即有效载荷,被隐藏并且秘密发送的信息。
19DDOS攻击
分布式拒绝服务攻击(英文意思是Distributed Denial of Service,简称DDoS)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击,其中的攻击者可以有多个。
20IDS
入侵检测系统(IDS是英文“Intrusion Detection Systems”的缩写)。专业上讲就是依照一定的安全策略,通过软、硬件,对网络、系统的运行状况进行监视,尽可能发现各种攻击企图、攻击行为或者攻击结果,以保证网络系统资源的机密性、完整性和可用性。
21IPS
入侵防御系统(IPS),有过滤攻击功能的特种安全设备。一般布于防火墙和外来网络的设备之间,依靠对数据包的检测进行防御(检查入网的数据包,确定数据包的真正用途,然后决定是否允许其进入内网)。
22WAF防护
WAF英文全称为Web Application Firewall,中文含义为网站应用级入侵防御系统,是一项网络安全技术,主要用于加强网站服务器安全。
23MD5算法
信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。
24黑盒测试
在未授权的情况下,模拟黑客的攻击方法和思维方式,来评估计算机网络系统可能存在的安全风险。
25白盒测试
白盒测试就偏向于代码审计。
26灰盒测试
基于白盒与黑盒测试之间的一种产物。
27僵尸网络(Botnet)
僵尸网络 Botnet是指采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。
28鱼叉攻击
“鱼叉攻击”通常是指利用木马程序作为电子邮件的附件,发送到目标电脑上,诱导受害者去打开附件来感染木马。
29钓鱼式攻击
钓鱼式攻击是一种企图从电子通讯中,通过伪装成信誉卓著的法人媒体以获得如用户名、密码和信用卡明细等个人敏感信息的犯罪诈骗过程。
30水坑攻击
水坑攻击”,黑客攻击方式之一,顾名思义,是在受害者必经之路设置了一个“水坑(陷阱)”。最常见的做法是,黑客分析攻击目标的上网活动规律,寻找攻击目标经常访问的网站的弱点,先将此网站“攻破”并植入攻击代码,一旦攻击目标访问该网站就会“中招”。
31社会工程学攻击
社会工程学(Social Engineering),是一种通过人际交流的方式获得信息的非技术渗透手段。
32TOP500姓名
中国常用姓名前500个,可以设置为攻击字典碰撞用户密码。
33DLL注入
将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。
34SQL注入
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
35sys驱动
驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作。
36加壳
对可执行程序进行资源压缩的手段. 另一种形式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
如有帮助,敬请采纳,谢谢!
热心网友 时间:2022-05-01 21:14
ssl协议:
什么是SSl安全协议?
SSL安全协议最初是由Netscape Communication公司设计开发的,又叫“安全套接层(Secure Sockets Layer)协议”,主要用于提高应用程序之间数据的安全系数。SSL协议的整个概念可以被总结为:一个保证任何安装了安全套接字的客户和服务器间事务安全的协议,它涉及所有TC/IP应用程序。
SSL安全协议主要提供三方面的服务:
·用户和服务器的合法性认证
认证用户和服务器的合法性,使得它们能够确信数据将被发送到正确的客户机和服务器上。客户机和服务器都是有各自的识别号,这些识别号由公开密钥进行编号,为了验证用户是否合法,安全套接层协议要求在握手交换数据时进行数字认证,以此来确保用户的合法性。
·加密数据以隐藏被传送的数据
安全套接层协议所采用的加密技术既有对称密钥技术,也有公开密钥技术。在客户机与服务器进行数据交换之前,交换SSL初始握手信息,在SSL握手情息中采用了各种加密技术对其加密,以保证其机密性和数据的完整性,并且用数字证书进行鉴别,这样就可以防止非法用户进行破译。
·保护数据的完整性
安全套接层协议采用Hash函数和机密共享的方法来提供信息的完整性服务,建立客户机与服务器之间的安全通道,使所有经过安全套接层协议处理的业务在传输过程中能全部完整准确无误地到达目的地。
安全套接层协议是一个保证计算机通信安全的协议,对通信对话过程进行安全保护,其实现过程主要经过如下几个阶段:
(1)接通阶段:客户机通过网络向服务器打招呼,服务器回应;
(2)密码交换阶段:客户机与服务器之间交换双方认可的密码,一般选用RSA密码算法,也有的选用Diffie-Hellmanf和Fortezza-KEA密码算法;
(3)会谈密码阶段:客户机器与服务器间产生彼此交谈的会谈密码;
(4)检验阶段:客户机检验服务器取得的密码;
(5)客户认证阶段:服务器验证客户机的可信度;
(6)结束阶段:客户机与服务器之间相互交换结束的信息。
当上述动作完成之后,两者间的资料传送就会加密,另外一方收到资料后,再将编码资料还原。即使盗窃者在网络上取得编码后的资料,如果没有原先编制的密码算法,也不能获得可读的有用资料。
发送时信息用对称密钥加密,对称密钥用非对称算法加密,再把两个包绑在一起传送过去。
接收的过程与发送正好相反,先打开有对称密钥的加密包,再用对称密钥解密。
在电子商务交易过程中,由于有银行参与,按照SSL协议,客户的购买信息首先发往商家,商家再将信息转发银行,银行验证客户信息的合法性后,通知商家付款成功,商家再通知客户购买成功,并将商品寄送客户。
ssl代理就是支持这个协议的代理,只有这样的代理才能访问ssl的网站,比如hxxps:webmail.yale.e
TLS是传输层安全协议。 它实际上是SSL3.1,在1996年提交到IETF标准委员会替换控制的。即将发行。
什么是PCT?
从名称上可以看出,专利合作条约是专利领域的一项国际合作条约。自采用巴黎公约以来,它被认为是该领域进行国际合作最具有意义的进步标志。但是,它主要涉及专利申请的提交,检索及审查以及其中包括的技术信息的传播的合作性和合理性的一个条约。PCT不对“国际专利授权”:授予专利的任务和责任仍然只能由寻求专利保护的各个国家的专利局或行使其职权的机构掌握(指定局)。PCT并非与巴黎公约竞争,事实上是其补充。的确,它是在巴黎公约下只对巴黎公约成员国开放的一个特殊协议。