6.4.4 边界检查

数字域的误用很有潜力。即使应用正确地限制数据为数字值,某些值仍然可能导致错误。边界检查是尝试极限值的简单技术。将UserID=19237换成UserID=0或者UserID=-1可能生成含有信息的错误或者奇怪的表现。上界也应该检查,一个字节的值不可能大于255,2个字节的值不可能大于65535。

1.http://www.victim.com/internal/CompanyList.asp?SortID=255Error:Your Search has timed out with too long of a list.

2.http://www.victim.com/internal/CompanyList.asp?SortID=256 Search Results

3.http://www.victim.com/internal/CompanyList.asp?SortID=0 Search Results

注意,将SortID设置为255不会返回成功的查询,但是例2中设置为256成功返回查询。当例3中SortID=0时,也发生了成功的查询。应用似乎预期一个8位的SortID值,这使得可接受范围在0~255之间——除了太长的255之外。因此,根据无符号8位值在255之后“回转”这一事实,我们可以有把握地假设256被翻译为0。因此,例2和例3中的请求在这种情况下是等价的,这使用户能够确定用于应用这个部分的数值的边界。

你(可能)不能从边界检查中获得命令执行或者任意文件访问。但是,它们生成的错误可能揭示关于应用或者服务器的有用信息。这种检查只需要少数几个数值:

·布尔型: 任何表现真或者假的值(T/F、true/false、yes/no、0/1)。尝试两个值;然后尝试无意义的值。对接收字符的参数使用数字;对接收数字的参数使用字符。

·数字型: 设置0和负值(0和-1最有效)。尝试各种范围的最大值,也就是,256、65536、4294967296,以及非常接近这些极限的值。

·字符串: 测试长度极限。确定字符串变量如名称和地址是否接收标点符号。