2005/05/20 | PHP之SQL注入资料集锦
类别(让工作更简单) | 评论(0) | 阅读(812) | 发表于 23:54
SQL注入 如果你的网站要发布在INTERNET上 这个问题就一定要关注了
查了一下 在GOOGLE搜索到的大部分都是 有关ASP的SQL注入专题
PHP的非常少 恰好单位无法上GOOGLE 我用一搜 搜索了一下 还是找到不少有用的资料 和我一样需要这些资料的朋友也看看吧
我觉得 还是将ID转成数值型的方法比较方便 自定义的检测代码太麻烦了 而且要防范的词汇有一打 PHP的也有 但在这里没有贴上 需要的就去一搜搜一下吧

以下是寻找到的内容:
防范的时候需要对用户的输入进行检查。特别式一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤。
tech.ccidnet.com/pub/article/c1110_a201665_p1.html 这里也有一些需要添加的字符
'|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" '可以自己修改怀疑是注入操作的字串N_noarray = split(LCase(N_no),"|")

   需要过滤的特殊字符及字符串有:

net user
xp_cmdshell
/add
exec master.dbo.xp_cmdshell
net localgroup administrators
select
count
Asc
char
mid
'
:
"
insert
delete from
drop table
update
truncate
from
%



www.hf110.com/Article/hack/hcjs/200502/88.html
magic_quotes_gpc=Off时的注入攻击
magic_quotes_gpc=Off的情况虽然说很不安全,新版本默认也让
magic_quotes_gpc=On了,可是在很多服务器中我们还发现magic_quotes_gpc=Off的情况,例如www.qichi.*。
还有某些程序像vbb论坛就算你配置magic_quotes_gpc=On,它也会自动消除转义字符让我们有机可乘,所以说
magic_quotes_gpc=Off的注入方式还是大有市场的。

php+mysql注入的防范方法。

在上一期的专题里已经讲了很多的防范方法,这里我就主要讲一下php+mysql注射攻击的防范方法。
大家看到,在magic_quotes_gpc=On的时候,很多的注射攻击已经没有作用了。
我们可以利用这个来加固我们的程序。Addslashes()函数等同于magic_quotes_gpc=On,而且与magic_quotes_gpc=On也不冲突,我们可以这样过滤
$username = addslashes($username);
$query="SELECT * FROM users WHERE userid='$username'");
对于id型我们可以利用intval()函数,intval()函数可以将变量转换成整数类型,这样就可以了。
我们可以这样
$id = intval($id);
$query="SELECT * FROM alphadb WHERE articleid='$id'");
如果是字符型的呢?
我们可以先用addslashes()过滤一下,然后再过滤"%"和"_".
例如:
$search = addslashes($search);
$search = str_replace("_","\_",$search);
$search = str_replace("%","\%",$search);
记得,可千万别在magic_quotes_gpc=On的情况下替换\为\\,如下:
$password=str_replace("\\","\\\\",$password);
我记得在darkness的文章《对某PHP站点的一次渗透》中提到过这个问题(在光盘中有收录)。
还有的就是登陆的地方,如果是只用一个管理员管理的话,我们可以直接对username和passwd用md5加密,这样就不用害怕注入技术的发展了。
Username=md5($HTTP_POST_VARS["username"]);
Passwd=md5($HTTP_POST_VARS["passwd"]);
我的后台登陆就是这样子的哦。


如果说php比asp易用,安全,从内置的函数就可以体现出来。如果是整形的变量,只需使用一个intval()函数即可解决问题,在执行查询之前,我们先处理一下变量,如下面的例子就是很安全的了: $id = intval($id);
mysql_query("SELECT * FROM article WHERE articleid='$id'");



  或者这样写:

mysql_query("SELECT * FROM article WHERE articleid=".intval($id)."")


字符串形的变量也可以用addslashes()整个内置函数了,这个函数的作用和magic_quotes_gpc一样,使用后,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的溢出字符。而且新版本的php,就算magic_quotes_gpc打开了,再使用addslashes()函数,也不会有冲突,可以放心使用。例子如下:

$username = addslashes($username);
mysql_query("SELECT * FROM members WHERE userid='$username'");



  或者这样写:

mysql_query("SELECT * FROM members WHERE userid=".addslashes($username)."")

 使用addslashes()函数还可以避免引号配对错误的情况出现。而刚才的前面搜索引擎的修补方法就是直接把“_”、“%”转换为“\_”“\%”就可以了,当然也不要忘记使用addslashes()函数。具体代码如下:

$keywords = addslashes($keywords);
$keywords = str_replace("_","\_",$keywords);
$keywords = str_replace("%","\%",$keywords);

www.fanghei.com/article/hacker/200502210327226338.htm
js版的防范SQL注入式攻击代码~:

[CODE START]  
<script language="javascript">
<!--
var url = location.search;
var re=/^\?(.*)(select%20|insert%20|delete%20from%20|count\(|drop%20table
   |update%20truncate%20|asc\(|mid\(|char\(|xp_cmdshell|exec%20master
   |net%20localgroup%20administrators|\"|:|net%20user|\'|%20or%20)(.*)$/gi;
var e = re.test(url);
if(e) {
alert("地址中含有非法字符~");
location.href="error.asp";
}
//-->
<script>
[CODE END]
   asp版的防范SQL注入式攻击代码~:

[CODE START]
<%
On Error Resume Next
Dim strTemp

If LCase(Request.ServerVariables("HTTPS")) = "off" Then
strTemp = "http://"
Else
strTemp = "https://"
End If

strTemp = strTemp & Request.ServerVariables("SERVER_NAME")
If Request.ServerVariables("SERVER_PORT") <> 80 Then strTemp = strTemp & ":" & Request.ServerVariables("SERVER_PORT")

strTemp = strTemp & Request.ServerVariables("URL")

If Trim(Request.QueryString) <> "" Then strTemp = strTemp & "?" & Trim(Request.QueryString)

strTemp = LCase(strTemp)

If Instr(strTemp,"select%20") or Instr(strTemp,"insert%20") or Instr(strTemp,"delete%20from") or Instr(strTemp,"count(") or Instr(strTemp,"drop%20table") or Instr(strTemp,"update%20") or Instr(strTemp,"truncate%20") or Instr(strTemp,"asc(") or Instr(strTemp,"mid(") or Instr(strTemp,"char(") or Instr(strTemp,"xp_cmdshell") or Instr(strTemp,"exec%20master") or Instr(strTemp,"net%20localgroup%20administrators") or Instr(strTemp,":") or Instr(strTemp,"net%20user") or Instr(strTemp,"'") or Instr(strTemp,"%20or%20") then
Response.Write "<script language='javascript'>"
Response.Write "alert('非法地址!!');"
Response.Write "location.href='error.asp';"
Response.Write "<script>"
End If
%>
[CODE END]
   C# 检查字符串,防SQL注入攻击

   这个例子里暂定为=号和'号

bool CheckParams(params object[] args)
{
  string[] Lawlesses={"=","'"};
  if(Lawlesses==null||Lawlesses.Length<=0)return true;
  //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].* (正则表达式相关内容请见MSDN)
  //另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;

  String str_Regex=".*[";
  for(int i=0;i< Lawlesses.Length-1;i++)
   str_Regex+=Lawlesses[i]+"|";
   str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
   //
   foreach(object arg in args)
   {
    if(arg is string)//如果是字符串,直接检查
    {
     if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
     return false;
    }
    else if(arg is ICollection)
     //如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
    {
     foreach(object obj in (ICollection)arg)
     {
      if(obj is string)
      {
       if(Regex.Matches(obj.ToString(),str_Regex).Count>0)
        return false;
      }
     }
    }
   }
   return true;

07188.net/Article/ShowArticle.asp?ArticleID=1073
php注入技巧

SQL注入不完全思路与防注入程序 ----这个了说了比较多的原理 但都是ASP的
www.chinabyte.com/475/1910975_1.shtml

台湾的防止SQL注入的方法
fj01.now.net.cn:7751/www.webjx.com/htmldata/2005-04-10/1113065103.html

SQL注入的攻与防

www.hackhome.com/leadbbs/htm_data/29/0504/453.html
在这里我总结了两个解决方案:手工防御、外加防御。

手工防御主要是指利用手工修改程序与脚本运行环境来达到清除漏洞的目的。ISNO在他的文章中使
用了替换函数对脚本吸入的变量进行替换形式的修改。
input = replace(input,"'","''")
除了单引号外,其他的注入符号也可以如此类推。至于脚本运行环境的修改主要是指删除一些容易
被骇客利用的扩展存储过程,如:
xp_cmdshell
xp_reg*
xp_servicecontrol
sp_oa*
xp_startmail
xp_sendmail
sp_makewebtask
等等。还有就是在调用数据库时最好把数据库的OWNER改为非sa用户,这样就可以防止骇客在得知S
QL注入后使用sp_addextendedproc进行扩展过程恢复了。

外加防御的方式就是配合其他设施(硬件/软件)对SQL注入的“根源”(客户端的POST内容)进行
过滤。无论是硬件还是软件它们的原理都是一样的,对POST的数据进行解码,一直到应用层,对应
用层的数据进行关键字过滤,最后进行相关的操作。在硬件的实施上,这样的防御行为主要是交给
过滤网关与IDS实现的。不过毕竟能用上这样的硬件设备的人还是不多的,所以我们选取软件作为
我们主要的“防御武器”,综合了一下最近的软件安全产品,最后还是推崇EEYE公司的SecureIIS

community.csdn.net/Expert/topic/3803/3803170.xml?temp=.6236078

大家存在5点误区:
1、sql注入比较难防,需要替换select,delete等一打字符
其实对于字符型替换再多都没有替换单引号为两个单引号来的好!对于数字型替换再多都没有用,一定要类型转换。
2、忽略DropDownList传来的东西
其实是不对的,一切客户端的东西都是不可信任的,select下拉框也是!因为可以自己做一个htm提交到服务器。
3、access比sqlserver不安全
安全不安全关键看怎么用,如果sqlserver还是像access一样用,一个sa帐户的话,很明显,sqlserver比access不安全,可以直接得到表名和字段名!access反而倒安全点了,因为只能通过逐位猜解得到。
4、网站没有显示出错信息就说明网站是安全的
当有记录的时候显示记录,没有记录的时候显示找不到任何记录,通过这两种状态就可以猜解字段名了,所以网页不出错不能说明是安全的
5、忽略post提交的信息
很多人对url上传递的东西过滤严格,对于post的东西不理不睬是不对的,post的东西更加容易被注入,因为一般字段比较多

在asp.net中强烈建议通过参数来实现sql而不是sql拼接,因为就算你每一个都过滤百密难有疏
比如:

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn);
SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50);
parm1.value=((TextBox)e.Item.FindControl("name")).Text;
SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int);
parm2.value=((TextBox)e.Item.FindControl("age")).Text;
SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);
parm3.value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
comm.Parameters.Add(parm1);
comm.Parameters.Add(parm2);
comm.Parameters.Add(parm3);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();


这样的代码看起来舒服而且又安全,何乐不为?

channel7.cn/2004/10-28/214916.html
这个更详细

apache防SQL注入


添加时间:2005-3-1 作者: 未知 来源: 未知 录入:billleo 关键字: apache防SQL注入

--------------------------------------------------------------------------------
应用Mod-security使Apache更安全

让Sql注入从此消失

# 打开或者关闭过滤引擎
SecFilterEngine On
# 设置缺省的动作
SecFilterDefaultAction "deny,log,status:404"
# 把设置传递给字目录
SecFilterInheritance Off
# 检测URL编码是否正确
SecFilterCheckURLEncoding On
# 检测内容长度以避免堆溢出攻击
SecFilterForceByteRange 32 126
# 日志文件的位置和名字
SecAuditLog logs/audit_log
# debug设置
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
# 检测POST数据
SecFilterScanPOST On
# 当匹配sh的时候,重新定向到一个特殊的页面,让攻击者知难而退
SecFilter sh redirect:http://secu.zzu.edu.cn/hack/fu.htm
# Only check the body of the POST request
#过滤一些敏感的东西,我们使用*是为了攻击者使用/etc/./passwd来绕开检测
SecFilter /etc/*passwd
SecFilter /bin/*sh
# 防止double dot攻击,也就是类似http://www.test.com/openfile.php?path=/../../..,虽然这个漏洞看似弱智,但是很多网站都有的,比如CERNET某大学某图片站:)
SecFilter "../"
# 防止跨站脚本(CSS)攻击
SecFilter "<( | )*script"
SecFilter "<(.| )+>"
# 防止SQL插入(SQL Injection)攻击
SecFilter "delete(空格| )+from"
SecFilter "insert(空格| )+into"
SecFilter "select(空格| )+from"
SecFilter "union(空格| )+from"
# 下面是限制了upload.php文件只能用来上传jpeg.bmp和gif的图片

SecFilterInheritance Off
SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"


0

评论Comments