每个GET和POST参数都是输入校验攻击的潜在目标。不管参数值是存在于FORM数据或者应用生成的,修改这些参数都很简单。最简单的攻击点是表单中的输入域。常见的域有登录名、密码、地址、电话号码、信用卡号和搜索。其他使用下拉菜单的域也不应该忽视。第一步是列举这些域及大概的输入类型。
不要受到误导,认为输入校验攻击只能针对用户必须完成的域。GET或POST请求中的每个变量都可能遭到攻击。攻击目标可以通过进行应用的深入爬行来识别,这种爬行同时编写文件、参数和表单域的目录,通常使用自动化工具完成。
cookie值是另一个目标。cookie包含的值绝不是为了让用户操纵的,但是它们仍然能够被注入,以执行SQL注入或者其他注入攻击。
cookie只是HTTP首部的一个特例。实际上,任何HTTP首部都是输入校验攻击的一个方向。另一个针对HTTP首部攻击的例子包括HTTP响应截断,合法的响应被过早地缩短,以便注入一组定制的首部(通常是cookies或者cache-control,这两个首部对客户端的破坏力最大)。
让我们更仔细地审视HTTP响应截断。这种攻击针对使用参数表示重定位的应用,例如,下面是一个可能遭受攻击的URL:
http://website/redirect.cgi?page=http://website/welcome.cgi
好的输入校验例程会确保Page参数包含有效的URL。但是如果可以包含任意的字符,参数可能被重写成下面的样子:
http://website/redirect.cgi?page=0d%0aContent-Type:%20text/html%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0a%0d%0a%3chtml%3eHello,world!%3c/html%3e
Page的原值已经被一系列模拟来自Web服务器的HTTP响应首部并且包含简单的HTML字符串“Hello,world!”的字符代替。将这一恶意载荷中的编码字符替换掉更容易理解:
Content-Type: text/html HTTP/1.1 200 OK Content-Type: text/html <html>Hello, world!</html>
最终结果是Web浏览器显示篡改的HTML内容而不是预期的重定向HTML内容。这个例子似乎无害,但是恶意攻击可以包含JavaScript或者对用户密码、社会保险号码、信用卡信息或者其他敏感信息的请求。这个例子的重点不在于如何创建有效的仿冒攻击,而是阐述如何操纵参数内容,产生意料之外的效果。