Web渗透_常识




① 高级的攻击者从来不会使用单一的手段进行攻击,而是根据目标的环境灵活组合。

② 对访问控制的利用是渗透测试人员的 一项核心技能。


1. 渗透测试一般步骤

2. session、cookie、token

3. 名词解释

4. 一次动态HTTP请求的过程

5. 常见端口对应的OSI七层分类

6. 加盐密码

7. DDOS攻击

8. 彩虹表

9. GET、POST

10. 一句话木马在防注入系统中的重生(思路)

11. 几道面试题

12. DLL、C段攻击、0Day漏洞、黑客攻击步骤

13. PHP代码执行函数

14. URL编码、宽字节注入

15. Windows下的“域、工作组”

16. XXE(XML外部实体)




1.  渗透测试一般步骤


happysneaker.com



例:拿到一个站怎么做?

(1) 信息收集

              a. 查找服务器的相关信息:ip,系统类型、版本,扫描开放端口;
              b. 网站指纹:服务器软件(版本)、编程语言(版本)、应用框架(版本);

              c. 域名的whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等);
              d. 查找子域名、旁站、CDN的IP;

              e. Google hacking 或其他搜索引擎的 hacking
              f. 扫描网站目录结构,后台地址,测试有没有关闭 APP_DEBUG,还有其他敏感文件等;

(2) 漏洞挖掘

            信息收集完成之后,针对暴露的敏感信息进行漏洞渗透测试,比如各种Web漏洞:SQL注入、XSS、CSRF等等;

(3) 漏洞利用

            测试渗透的极限,提权,对敏感信息的控制与操作。

(4) 总结、报告





关于旁站攻击(旁注攻击): https://blog.csdn.net/hitwangpeng/article/details/46865523





2.  session 、cookie、token的区别及联系


详见:https://www.cnblogs.com/wxinyu/p/9154178.html   ,这篇文章写得超好。又看了一遍写得真的好。


session

  session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。


cookie

  cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用。

token

     token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。


cookie 和session的区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中

6、具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力。

7、cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。


token 和session 的区别

    session 和 oauth token并不矛盾,作为身份认证 token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态(登录状态、答题进度状态、邮件草稿)。Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。

而session机制采用的是一种在服务器端保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式 。

session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。






3. 


跳板:

使用肉鸡IP来实施攻击其他目标,以便更好的隐藏自己的身份信息。


旁站入侵:

即同服务器下的网站入侵,入侵之后可以通过提权跨目录等手段拿到目标网站的权限。


C段嗅探:

每个IP有ABCD四个段,也就是说是D段1-255中的一台服务器,然后利用工具嗅探拿下该服务。


肉鸡:

被攻击者攻下、控制的服务器。


重放攻击:

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

重放攻击可分为3种:

第一种是直接重放,即重放给原来的验证端,直接重放的发送方和接收方均不变。

第二种是反向重放,将原本发给接收方的消息反向重放给发送方。

第三种是第三方重放,将消息重放给域内的其他验证端。






4. 一次HTTP动态请求的过程:


happysneaker.com






5. 

 

OSI 七层划分:

应用层 :文件传输,电子邮件,文件服务,虚拟终端 :TFTP,HTTPSNMPFTPSMTPDNSTelnet

表示层 :数据格式化,代码转换,数据加密 没有协议

会话层 解除或建立与别的接点的联系 没有协议

传输层 :提供端对端的接口 TCPUDP

网络层 :为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP

数据链路层 :传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARPRARP,MTU

物理层 :以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2


TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供数据可靠传输,面向连接。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不提供可靠性、 流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要 有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(域名解析协议)、TFTP(通用文件传输协议)等。



常见协议端口划分:(https://blog.csdn.net/dream_1996/article/details/73481201


TCP端口:

即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP的21端口,Telnet的23

端口,SMTP的25端口,HTTP的80端口。

UDP端口:

即用户数据报协议端口,无需在客户端和服务器端建立连接,安全性得不到保障。常见的DNS的53端口,SNMP(简单网络管理协

议)的161端口,QQ使用的8000和4000端口。


21/tcp FTP 文件传输协议,21用于连接,20用于主动模式传送数据,被动模式下端口号由服务端和客户端协商决定。
22/tcp SSH 安全登录、文件传送(SCP)和端口重定向。
23/tcp Telnet 不安全的文本传送,远程连接。
25/tcp SMTP Simple Mail Transfer Protocol (E-mail)。
80/tcp HTTP 超文本传送协议 (WWW)。
88/tcp Kerberos Authenticating agent (身份认证)。
110/tcp POP3 Post Office Protocol (E-mail)。
443/tcp HTTPS 安全的超文本传输协议 (Securely)。




6. 加盐密码


(哈希的英文是Hash,中文可翻译成散列或者哈希,它其实就是一个算法,最简单的算法就是加减乘除,比方,我设计个数字算法,输入+5=输出,比如我输入1,输出为6;输入2,输出为7。哈希有什么好处呢?比方说我们从服务器下载一个软件,如果这个软件被黑客更改了,那么我们下载的就不是原来的软件,如果是银行客户端可能就会有账户被盗的风险,但是有了哈希运算后,我们可以把下载的软件经过哈希运算后得到哈希值,然后把哈希值跟软件发行方公布的哈希值对比,就知道软件是否有被篡改了。同样比如我们登陆网站的密码也是一个很好的哈希运用,网站服务器如果读取的是我们的密码,那不是很危险吗,有了哈希,服务器只用匹配哈希就可以了,而不用读取我们的隐私。

哈希算法不过是一个更为复杂的运算,它的输入可以是字符串,可以是数据,可以是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。但是哈希算法有一个很大的特点,就是你不能从结果推算出输入。)


盐(Salt)是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。这样能给攻击者增加攻击成本,加盐的关键在于如何选择盐:



① 固定字符串

采用固定的字符串作为盐,如下面这样:

const encrypt = (text) => {
    text = text + 'zp';
    return crypto.createHash("md5").update(text).digest("hex");
};

这种加盐方式与多进行几次md5一样的,没有任何意义,攻击者都可以拿到数据库,难道拿不到源代码吗,根据源代码攻击者很轻松的就可以构造新的彩虹表出来逆推密码。


② 随机字符串

盐一般要求是固定长度的随机字符串,且每个用户的盐不同,比如10位,数据库可以这样存储:

username | password                         |salt  
---------|---------—-----------------------|----------
zp1996   |2636fd8789595482abf3423833901f6e  |63UrCwJhTH   
zpy      |659ec972c3ed72d04fac7a2147b5827b  |84GljVnhDT

采用的加密方式为:md5(md5(password) + salt)






7. DDOS 攻击


https://www.cnblogs.com/2myroad/articles/3881042.html ,好文章。


比如: SYN Flood


SYN Flood是互联网上最经典的DDoS攻击方式之一,最早出现于1999年左右,雅虎是当时最著名的受害者。SYN Flood攻击利用了TCP三次握手的缺陷,能够以较小代价使目标服务器无法响应,且难以追查。
标准的TCP三次握手过程如下:

  1. 客户端发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;

  2. 服务器在收到客户端的SYN报文后,将返回一个SYN ACK(即确认Acknowledgement)的报文,表示客户端的请求被接受,同时TCP初始序号自动加一。

  3. 客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一。


经过这三步,TCP连接就建立完成。TCP协议为了实现可靠传输,在三次握手的过程中设置了一些异常处理机制。第三步中如果服务器没收到客户端的最终ACK确认报文,会一直处于SYN_RECV状态,将客户端IP加入等待列表,并重发第二步的SYN ACK报文。重发一般进行3-5次,大约间隔30秒左右轮询一次等待列表重试所有客户端。另一方面,服务器在自己发出了SYN ACK报文后,会预分配资源为即将建立的TCP连接储存信息做准备,这个资源在等待重试期间一直保留。更为重要的是,服务器资源有限,可以维护的SYN_RECV状态超过极限后就不再接受新的SYN报文,也就是拒绝新的TCP连接建立。
SYN Flood正是利用了上文中TCP协议的设定,达到攻击的目的。攻击者伪装大量的IP地址给服务器发送SYN报文,由于伪造的IP地址几乎不可能存在,也就几乎没有设备会给服务器返回任何应答了。因此,服务器将会维持一个庞大的等待列表,不停的重试发送SYN ACK报文,同时占用着大量的资源无法释放。更关键的是,被攻击服务器的SYN_RECV队列被恶意的数据包占满,不再接受新的SYN请求,合法用户无法完成三次握手建立起TCP连接。也就是说,这个服务器被SYN Flood拒绝服务了。


(HTTP Flood还有个剖有历史渊源的昵称叫做CC攻击。CCChallenge Collapsar的缩写,而Collapsar是国内一家著名安全公司的DDoS防御设备。)




8. 彩虹表


因为md5不可逆(指攻击者不能从哈希值h(x)中逆推出x)而且碰撞几率低(指攻击值不能找到两个值x、x’具有相同的哈希值);然而这种方式也是不安全的,只要枚举出所有的常用密码,做成一个索引表,就可以推出来原始密码,这张索引表也被叫做“彩虹表”(之前csdn600万用户明文密码就是一个很好的素材)。





9. GET请求与POST请求


GET和POST是HTTP请求的两种基本方法,最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

happysneaker.com

再比如:

① GET在浏览器回退时是无害的,而POST会再次提交请求;

② GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留;

③ GET请求在URL中传送的参数是有长度限制的,而POST么有;

④ GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制;




但是,这只是表面上的区别,从本质看:

GET和POST是什么?HTTP协议中的两种发送请求的方法。HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。(你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。 )


GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。 


到这里还没结束,GET和POST还有一个重大区别:

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。


当然本质理解即可,容易看出的还是上面四点。





10. 一句话木马在防注入系统中的重生


思路:

对于目前流行的sql注入,程序员在编写程序时,都普遍的加入防注入程序,有些防注入程序只要在我们提交一些非法的参数后,就会自动的记录下你的IP地址,提交的非法参数和动作等,同时也把非法提交的数据写入了系统的后缀为ASP的文件中,这也给了我们一些可利用的地方,大家知道,一句话马就是利用程序过滤的不完全而写入的,按照这思路,我们是否可以在提交非法参数中加入一句话马而防注入程序就会记录我们提交的数据和一句话马并写入数据库,从而得到一个WEBSHELL呢 ?


某个防注入系统,在注入时会提示:

        系统检测到你有非法注入的行为。 已记录您的ip xx.xx.xx.xx 时间:2016:01-23 提交页面:test.asp?id=15 提交内容:and 1=1

如何利用这个防注入系统拿shell?

       在URL里面直接提交一句话,这样网站就把你的一句话也记录进数据库文件了 这个时候可以尝试寻找网站的配置文件 直接上菜刀链接。






11.几道面试题


在有shell的情况下,如何使用xss实现对目标站的长久控制?

  • 后台登录处加一段记录登录账号密码的js,并且判断是否登录成功,如果登录成功,就把账号密码记录到一个生僻的路径的文件中或者直接发到自己的网站文件中。(此方法适合有价值并且需要深入控制权限的网络)。

  • 在登录后才可以访问的文件中插入XSS脚本。


后台修改管理员密码处,原密码显示为*。你觉得该怎样实现读出这个用户的密码?

  • 审查元素 把密码处的password属性改成text就明文显示了


目标站无防护,上传图片可以正常访问,上传脚本格式访问则403.什么原因?

  • 原因很多,有可能web服务器配置把上传目录写死了不执行相应脚本,尝试改后缀名绕过


sql注入有以下两个测试选项,选一个并且阐述不选另一个的理由:

        A. demo.jsp?id=2+1 B. demo.jsp?id=2-1 
        选B,在 URL 编码中 + 代表空格,可能会造成混淆


以下链接存在 sql 注入漏洞,对于这个变形注入,你有什么思路?

    demo.do?DATA=AjAxNg== 
    DATA有可能经过了 base64 编码再传入服务器,所以我们也要对参数进行 base64 编码才能正确完成测试


CSRF 和 XSS 和 XXE 有什么区别,以及修复方式?

        XSS是跨站脚本攻击,用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等攻击。修复方式:对字符实体进行转义、使用HTTP Only来禁止JavaScript读取Cookie值、输入时校验、浏览器与Web应用端采用相同的字符编码;

        CSRF是跨站请求伪造攻击,XSS是实现CSRF的诸多手段中的一种,是由于没有在关键操作执行时进行是否由用户自愿发起的确认。修复方式:筛选出需要防范CSRF的页面然后嵌入Token、再次输入密码、检验Referer ;
        XXE是XML外部实体注入攻击,XML中可以通过调用实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取。修复方式:XML解析库在调用时严格禁止对外部实体的解析。


CSRF、SSRF和重放攻击有什么区别?

        CSRF是跨站请求伪造攻击,由客户端发起 ;
        SSRF是服务器端请求伪造,由服务器发起 ;
        重放攻击有三种,见前面的文章。


说出至少三种业务逻辑漏洞,以及修复方式?

        密码找回漏洞中存在密码允许暴力破解、存在通用型找回凭证、可以跳过验证步骤、找回凭证可以拦包获取等方式来通过厂商提供的密码找回功能来得到密码;
        身份认证漏洞中最常见的是会话固定攻击和 Cookie 仿冒,只要得到 Session 或 Cookie 即可伪造用户身份;
        验证码漏洞中存在验证码允许暴力破解、验证码可以通过 Javascript 或者改包的方法来进行绕过。




12. 


DLL

DLL(Dynamic Link Library)文件,即动态链接库,也有人称作应用程序拓展。Windows应用程序中,实行了模块化设计,也就是说并不是每个应用程序都编写完所有的功能代码,而是在运行过程中调用相应功能的DLL,不需运行的功能就不调用,所以大大加快了程序的加载速度和效率,其他应用程序也可以调用相关的DLL,这样也有利于促进代码重用以及内存使用效率,减少了资源占用,而且程序更新时也只要更新相关的DLL就可以了。要注意的是,有些病毒也会伪装成DLL文件,并替换系统的DLL文件,需要我们防范。


(1)DLL劫持原理

由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。伪造的dll制作好后,放到程序当前目录下,这样当原程序调用原函数时就调用了伪造的dll的同名函数,进入劫持DLL的代码,处理完毕后,再调用原DLL此函数。

(2)如何防止DLL劫持

DLL劫持利用系统未知DLL的搜索路径方式,使得程序加载当前目录下的系统同名DLL。所以可以告诉系统DLL的位置,改变加载系统DLL的顺序不是当前目录,而是直接到系统目录下查找。



0day漏洞

0day漏洞是指已经发现但是官方还没发布补丁的漏洞。(比如黑客在官方发布补丁前就发现了,官方甚至还没意识到漏洞的存在)


C段入侵

即同C段下服务器入侵。如目标ip为192.168.180.253 入侵192.168.180.*的任意一台机器,然后利用一些黑客工具嗅探获取在网络上传输的各种信息。


软件脱壳

① 名词解释:从技术的角度出发,壳是一段执行于原始程序前的代码。当加壳后的文件执行时,壳-这段代码先于原始程序运行,他把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。

② 壳分类:加密壳、压缩壳、伪装壳、多层壳等,目的都是为了压缩程序、或隐藏程序真正的OEP(入口点,防止被破解)

③ “加壳”指的是对编译好的EXE、DLL等文件采用加壳来进行保护;“脱壳”指的就是将文件外边的壳去除,恢复文件没有加壳前的状态。顾名思义,压缩壳只是为了减小程序体积对资源进行压缩;加密壳也就是常说的保护壳、猛壳,它对程序输入表等内容进行加密保护;密码壳平时使用得不多,加密壳的程序只有在正确输入密码后才能运行。


黑客攻击流程

(1)攻击前:网络踩点、网络扫描、网络查点
(2)攻击中:利用漏洞信息进行渗透攻击、获取权限
(3)攻击后:后渗透维持攻击、文件拷贝、木马植入、痕迹擦除


你获取网络安全知识途径有哪些?

  • 社区:看雪,乌云,FreeBuf;

  • 视频、实验:i春秋,51cto,慕课网,实验楼,实验吧,各种云课堂;

  • 书籍:《白帽子讲web安全》《Web应用安全权威指南》等;

  • 请教牛人、公司内技术分享。



蜜罐

蜜罐好比是情报收集系统。蜜罐好像是故意让人攻击的目标,引诱黑客前来攻击。所以攻击者入侵后,你就可以知道他是如何得逞的,随时了解针对服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系,收集黑客所用的种种工具,并且掌握他们的社交网络。



一句话木马

php一句话木马:

<?php@eval($_POST[value]);?>   

变形:<?php$x=$_GET[‘z’];@eval(“$x;”);?>


IP地址

A类 10.0.0.0--10.255.255.255

B类 172.16.0.0--172.31.255.255

C类 192.168.0.0--192.168.255.255

Internet设计者保留了IPv4地址空间的一部份供专用地址使用,专用地址空间中的IPv4地址叫专用地址,这些地址永远不会被当做公用地址来分配,所以专用地址永远不会与公用地址重复.

IPv4专用地址如下:

IP等级 IP位置

ClassA 10.0.0.0-10.255.255.255

默认子网掩码:255.0.0.0

ClassB 172.16.0.0-172.31.255.255

默认子网掩码:255.240.0.0

ClassC 192.168.0.0-192.168.255.255

默认子网掩码:255.255.0.0








13. PHP代码执行函数总结 : https://www.cnblogs.com/xiaozi/p/7834367.html


PHP中可以执行代码的函数,常用于编写一句话木马,可能导致代码执行漏洞,这里对代码执行函数做一些归纳。

  常见代码执行函数,如  

    eval()、assert()、preg_replace()、create_function()

    array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()

    文件操作函数、动态函数($a($b))


比如:::::::::::


eval() 

  eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:<?php eval($_POST[cmd])?>


assert()

   与eval类似,字符串被 assert() 当做 PHP 代码来执行,示例代码:

<?php 
//?cmd=phpinfo()assert($_REQUEST[cmd]); 
?>






14. URL编码、宽字节注入深入探究宽字节注入漏洞与修补原理


URL编码:

① URL编码遵循下列规则: 每对name/value由 &;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。

②任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括像 = & ;和 % 这些特殊的字符。其实 url编码 就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。


宽字节注入原理一:

在GBK编码时,mysql会认为两个字符是一个汉字(在前一个字节的ascii码大于128的情况下,见下图)。经过转义之后的单引号会变为\’,即 %5c%27。构造 id=1%df%27%23 ,在经过转义传递给mysql时,就是 id=1%df%5c%27%23,mysql在解析时,会认为 %df%5c 是一个汉字,而 %27 就会闭合掉原本sql语句中的(左)单引号,即 select xxx from xxx where id='1%df%5c'#'。

宽字节注入原理二:

大家都知道 %df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠 \ ,变成了 %df\’ ,其中 \ 的十六进制是 %5C ,那么现在 %df\’ = %df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是 縗’ ,也就是说: %df\’ = %df%5c%27=縗’,有了单引号就好注入了。


happysneaker.com


宽字节注入应对方案:


有一种最好的修补就是:

(1)使用mysql_set_charset(GBK)指定字符集

(2)使用mysql_real_escape_string进行转义

原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现前面e5和5c拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢?

就是使用mysql_set_charset进行指定。

上述的两个条件是“与”运算的关系,少一条都不行。

测试;

happysneaker.com
输出:

happysneaker.com
效果很明显。


注意  :

(1)%5c%27  经过URL解码之后就是  \'  ,   %23 就是  #    。

(2)mysql注释符有三种:

        1、#...

        2、"--  ..."

        3、/*...*/

(3)gbk编码原理:一个字符占1个字节,两个字节以上叫宽字节。






15. Windows下的 “域、工作组”


(1) “域”的真正含义指的是服务器控制网络上的计算机能否加入的计算机组合。

(2) 不过在“域”模式下,至少有一台服务器负责每一台联入网络的电脑和用户的验证工作,相当于一个单位的门卫一样,称为“域控制器(Domain Controller,简写为DC)”。

(3) 域控制器中包含了由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。当电脑联入网络时,域控制器首先要鉴别这台电脑是否是属于这个域的,用户使用的登录账号是否存在、密码是否正确。如果以上信息有一样不正确,那么域控制器就会拒绝这个用户从这台电脑登录。不能登录,用户就不能访问服务器上有权限保护的资源,他只能以对等网用户的方式访问Windows共享出来的资源,这样就在一定程度上保护了网络上的资源。

(4) 要把一台电脑加入域,仅仅使它和服务器在网上邻居中能够相互“看”到是远远不够的,必须要由网络管理员进行相应的设置,把这台电脑加入到域中。这样才能实现文件的共享,集中统一,便于管理。如果企业网络中计算机和用户数量较多时,要实现高效管理,就需要windows域。

(5) 那么“域”和“工作组”有什么区别呢?

首先 工作组是一群计算机的集合,它仅仅是一个逻辑的集合,各自计算机还是各自管理的,你要访问其中的计算机,还是要到被访问计算机上来实现用户验证的。而域不同,域是一个有安全边界的计算机集合,在同一个域中的计算机彼此之间已经建立了信任关系,在域内访问其他机器,不再需要被访问机器的许可了。

其次 域和工作组适用的环境不同,域一般是用在比较大的网络里,工作组则较小,在一个域中需要一台类似服务器的计算机,叫域控服务器,其他电脑如果想互相访问首先都是经过它的,但是工作组则不同,在一个工作组里的所有计算机都是对等的,也就是没有服务器和客户机之分的,但是和域一样,如果一台计算机想访问其他计算机的话首先也要找到这个组中的一台类似组控服务器,组控服务器不是固定的,以选举的方式实现,它存储着这个组的相关信息,找到这台计算机后得到组的信息然后访问。





16. XXE(XML外部实体)

如果攻击者可以上传XML文档或者在 XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,他们就能够攻击含有缺陷的XML处理器。








Web安全技术分享
请先登录后发表评论
  • 最新评论
  • 总共0条评论