<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[ASP漏洞全接触-进阶篇]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Fri, 29 Jun 2007 18:38:51 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	在入门篇，我们学会了SQL注入的判断方法，但真正要拿到网站的保密内容，是远远不够的。接下来，我们就继续学习如何从数据库中获取想要获得的内容，首先，我们先看看SQL注入的一般步骤：<br/><br/>　　第一节、SQL注入的一般步骤 <br/><br/>　　首先，判断环境，寻找注入点，判断数据库类型，这在入门篇已经讲过了。 <br/><br/>　　其次，根据注入参数类型，在脑海中重构SQL语句的原貌，按参数类型主要分为下面三种： <br/><br/>　　(A) ID=49 这类注入的参数是数字型，SQL语句原貌大致如下： <br/>　　Select * from 表名 where 字段=49 <br/>　　注入的参数为ID=49 And [查询条件]，即是生成语句： <br/>　　Select * from 表名 where 字段=49 And [查询条件] <br/><br/><br/>　　(B) Class=连续剧 这类注入的参数是字符型，SQL语句原貌大致概如下： <br/>　　Select * from 表名 where 字段=’连续剧’ <br/>　　注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ，即是生成语句： <br/>　　Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’ <br/><br/>　　(C) 搜索时没过滤参数的，如keyword=关键字，SQL语句原貌大致如下： <br/>　　Select * from 表名 where 字段like ’%关键字%’ <br/>　　注入的参数为keyword=’ and [查询条件] and ‘%25’=’， 即是生成语句： <br/>　　Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’ <br/><br/>　　接着，将查询条件替换成SQL语句，猜解表名，例如： <br/><br/>　　ID=49 And (Select Count(*) from Admin)&gt;=0 <br/><br/>　　如果页面就与ID=49的相同，说明附加条件成立，即表Admin存在，反之，即不存在（请牢记这种方法）。如此循环，直至猜到表名为止。 <br/><br/>　　表名猜出来后，将Count(*)替换成Count(字段名)，用同样的原理猜解字段名。 <br/><br/>　　有人会说：这里有一些偶然的成分，如果表名起得很复杂没规律的，那根本就没得玩下去了。说得很对，这世界根本就不存在100%成功的黑客技术，苍蝇不叮无缝的蛋，无论多技术多高深的黑客，都是因为别人的程序写得不严密或使用者保密意识不够，才有得下手。 <br/><br/>　　有点跑题了，话说回来，对于SQLServer的库，还是有办法让程序告诉我们表名及字段名的，我们在高级篇中会做介绍。 <br/><br/><br/>　　最后，在表名和列名猜解成功后，再使用SQL语句，得出字段的值，下面介绍一种最常用的方法－Ascii逐字解码法，虽然这种方法速度很慢，但肯定是可行的方法。 <br/><br/>　　我们举个例子，已知表Admin中存在username字段，首先，我们取第一条记录，测试长度： <br/><br/>　　http://www.19cn.com/showdetail.asp?id=49 ;;and (select top 1 len(username) from Admin)&gt;0 <br/><br/>　　先说明原理：如果top 1的username长度大于0，则条件成立；接着就是&gt;1、&gt;2、&gt;3这样测试下去，一直到条件不成立为止，比如&gt;7成立，&gt;8不成立，就是len(username)=8 <br/><br/>　　当然没人会笨得从0,1,2,3一个个测试，怎么样才比较快就看各自发挥了。在得到username的长度后，用mid(username,N,1)截取第N位字符，再asc(mid(username,N,1))得到ASCII码，比如： <br/><br/>　　id=49 and (select top 1 asc(mid(username,1,1)) from Admin)&gt;0 <br/><br/>　　同样也是用逐步缩小范围的方法得到第1位字符的ASCII码，注意的是英文和数字的ASCII码在1-128之间，可以用折半法加速猜解，如果写成程序测试，效率会有极大的提高。 <br/><br/>　　第二节、SQL注入常用函数 <br/><br/>　　有SQL语言基础的人，在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平，特别是一些常用的函数及命令。 <br/><br/>　　Access：asc(字符) SQLServer：unicode(字符) <br/><br/>　　作用：返回某字符的ASCII码 <br/><br/>　　Access：chr(数字) SQLServer：nchar(数字) <br/><br/>　　作用：与asc相反，根据ASCII码返回字符 <br/><br/>　　Access：mid(字符串,N,L) SQLServer：substring(字符串,N,L) <br/><br/>　　作用：返回字符串从N个字符起长度为L的子字符串，即N到N+L之间的字符串 <br/><br/>　　Access：abc(数字) SQLServer：abc (数字) <br/><br/>　　作用：返回数字的绝对值（在猜解汉字的时候会用到） <br/><br/>　　Access：A between B And C SQLServer：A between B And C <br/><br/>　　作用：判断A是否界于B与C之间 <br/><br/>　　第三节、中文处理方法 <br/><br/>　　在注入中碰到中文字符是常有的事，有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解，“中文恐惧症”很快可以克服。 <br/><br/>　　先说一点常识： <br/><br/>　　Access中，中文的ASCII码可能会出现负数，取出该负数后用abs()取绝对值，汉字字符不变。 <br/><br/>　　SQLServer中，中文的ASCII为正数，但由于是UNICODE的双位编码，不能用函数ascii()取得ASCII码，必须用函数unicode ()返回unicode值，再用nchar函数取得对应的中文字符。 <br/><br/>　　了解了上面的两点后，是不是觉得中文猜解其实也跟英文差不多呢？除了使用的函数要注意、猜解范围大一点外，方法是没什么两样的。 
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] ASP漏洞全接触-进阶篇]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>