不知道在哪儿看自己的攻击力和热血江湖2000防御力力

网络安全防护不得不知道的基于约束条件的SQL攻击
防护不得不知道的基于约束条件的SQL攻击。目前值得高兴的是,开发者在建立网站时,已经开始关注安全问题了&&几乎每个开发者都知道SQL注入了。在本文中,我将为读者介绍另一种与SQL相关的漏洞,虽然它的危害性与SQL注入不相上下,但目前却很少为人所知。接下来,我将为读者详细展示这种攻击手法,以及相应的防御策略。
最近,我遇到了一段有趣的代码,它尝试尽一切可能来保护数据库的访问安全,例如每当新用户进行注册时,将运行以下代码:
// Checking whether a user with the same username exists
$username = _real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$query = &SELECT *
&&&&&&&&& FROM users
&&&&&&&&& WHERE username='$username'&;
$res = mysql_query($query, $database);
if($res) {
& if(mysql_num_rows($res) & 0) {
&&& // User exists, exit gracefully
&&& // If not, only then insert a new entry
&&& $query = &INSERT INTO users(username, password)
&&&&&&&&&&&&& VALUES ('$username','$password')&;
为了验证登录信息,将用到下列代码:
$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$query = &SELECT username FROM users
&&&&&&&&& WHERE username='$username'
&&&&&&&&&&&&& AND password='$password' &;
$res = mysql_query($query, $database);
if($res) {
& if(mysql_num_rows($res) & 0){
&&&&& $row = mysql_fetch_assoc($res);
&&&&& return $row['username'];
安全注意事项周全吗?
过滤用户输入参数了吗? - 检查了
使用单引号(')来增加安全性了吗? - 检查了
很好,还有什么可能出错的地方吗?
是的,攻击者依然能够以任意用户身份进行登录!
在谈论这种攻击手法之前,首先需要介绍几个至关重要的知识点。
1. 在处理SQL中的字符串时,字符串末尾的空格字符都会被删除。换句话说,&vampire&与&vampire &几乎是等效的,这在大多数情况下是正确的,例如WHERE子句中的字符串或INSERT语句中的字符串。例如,以下语句的查询结果,与使用用户名&vampire&进行查询时的结果是一样的。
&&& SELECT * FROM users WHERE username='vampire&&&& ';
但是,除此之外也确实存在例外情况,例如LIKE子句。注意,对尾部空白字符的这种修剪操作,主要是在&字符串比较&期间进行的。这是因为,SQL会在内部使用空格来填充字符串,以便在比较之前使其它们的长度保持一致。
2. 在任意INSERT查询中,SQL会根据varchar(n)来限制字符串的最大长度,也就是说,如果字符串的长度大于&n&个字符的话,那么仅使用字符串的前&n&个字符。例如,如果特定列的长度约束为&5&个字符,那么在插入字符串&vampire&时,实际上只能插入字符串的前5个字符,即&vampi&。
现在,让我们建立一个测试数据库来演示具体攻击过程。
vampire@linux:~$ mysql -u root -p
mysql& CREATE DATABASE
Query OK, 1 row affected (0.03 sec)
mysql& USE
Database changed
我将创建一个数据表users,它有两列,即username和password。并且,这两个字段的最大长度为25个字符。接下来,我将插入一行记录,其中以&vampire&作为用户名,以&my_password&作为密码。
mysql& CREATE TABLE users (
&&& -&&& username varchar(25),
&&& -&&& password varchar(25)
Query OK, 0 rows affected (0.09 sec)
mysql& INSERT INTO users
&&& -& VALUES('vampire', 'my_password');
Query OK, 1 row affected (0.11 sec)
mysql& SELECT * FROM
+----------+-------------+
| username | password&&& |
+----------+-------------+
| vampire& | my_password |
+----------+-------------+
1 row in set (0.00 sec)
为了展示尾部空白字符的修剪情况,我们可以输入下列命令:
mysql& SELECT * FROM users
&&& -& WHERE username='vampire&&&&&& ';
+----------+-------------+
| username | password&&& |
+----------+-------------+
| vampire& | my_password |
+----------+-------------+
1 row in set (0.00 sec)
现在,假设一个易受攻击的网站使用了前面提到的代码来处理用户的注册和登录。为了入侵任意用户的帐户(就本例来说,用户名为&vampire&),只需使用用户名&vampire[一些空白字符]1&和一个随机密码进行注册即可。对于选择的用户名,前25个字符应该只包含vampire和空白字符。这样做的好处是,将有助于绕过检查特定用户名是否已存在的查询。
{C}mysql& SELECT * FROM users
&&& -& WHERE username='vampire&&&&&&&&&&&&&&&&&& 1';
Empty set (0.00 sec)
需要注意的是,在执行SELECT查询语句时,SQL是不会将字符串缩短为25个字符的。因此,这里将使用完整的字符串进行搜索,所以不会找到匹配的结果。接下来,当运行INSERT查询语句时,它只会插入前25个字符。
mysql&&& INSERT INTO users(username, password)
&&& -& VALUES ('vampire&&&&&&&&&&&&&&&&&& 1', 'random_pass');
Query OK, 1 row affected, 1 warning (0.05 sec)
mysql& SELECT * FROM users
&&& -& WHERE username='vampire';
+---------------------------+-------------+
| username&&&&&&&&&&&&&&&&& | password&&& |
+---------------------------+-------------+
| vampire&&&&&&&&&&&&&&&&&& | my_password |
| vampire&&&&&&&&&&&&&&&&&& | random_pass |
+---------------------------+-------------+
2 rows in set (0.00 sec)
很好,如果现在搜索&vampire&的话,将返回两个用户。注意,第二个用户名实际上是&vampire&加上尾部的18个空格。现在,如果使用用户名&vampire&和密码&random_pass&登录的话,则所有搜索该用户名的SELECT查询都将返回第一个数据记录,也就是原始的数据记录。这样的话,攻击者就能够以原始用户身份登录。
这个攻击已经在MySQL和SQLite上成功通过测试。我相信它同样适用于其他数据库下。
显然,要想开发安全的软件,必须对这种安全漏洞严加防范。下面是我们可采取的几项防御措施:
1. 应该为要求/预期具有唯一性的那些列添加UNIQUE约束。这实际上是一个非常重要的软件开发规则。即使您的代码已经提供了完整性检查,也要正确定义您的数据。由于'username'列具有UNIQUE约束,所以插入另一个记录将是不可能的。这两个字符串将被视为等同的,并且INSERT查询将失败。
2. 最好使用'id'作为数据库表的主键。此外,数据应该通过程序中的id进行跟踪。
3. 为了增加安全性,您还可以手动方式将输入参数修剪为特定长度(具体长度可以视数据库的中设置而定)。|  
|  
|  
|  
|  
只需一步,快速开始
查看: 2722|回复: 6
不知道有没有和我一样的,发现一个攻击力和法印强度的BUG!!!!
主题帖子积分
初级玩家, 积分 95, 距离下一级还需 5 积分
初级玩家, 积分 95, 距离下一级还需 5 积分
每次进游戏后角色旁边的天赋树清空后重新放置一边会高出很多数值,每次都这样!
重新进入后都必须重新放置一边,有没有和我一样的?
主题帖子积分
游戏狂人, 积分 1377, 距离下一级还需 623 积分
游戏狂人, 积分 1377, 距离下一级还需 623 积分
+1~~~~~~~~~~~~~~~~~~~~~~~~~
主题帖子积分
游戏狂人, 积分 1732, 距离下一级还需 268 积分
游戏狂人, 积分 1732, 距离下一级还需 268 积分
没看懂,具体怎么弄啊
主题帖子积分
超级玩家, 积分 637, 距离下一级还需 363 积分
超级玩家, 积分 637, 距离下一级还需 363 积分
主题帖子积分
游戏达人, 积分 2649, 距离下一级还需 851 积分
游戏达人, 积分 2649, 距离下一级还需 851 积分
应该是 界面写错了& &&&教程 那里 说& &&&每X一个&&+ %100& && &也就是&&3个 同颜色的 是 %300& && &只放 大的 一个 小同颜色的 不放是 % 0 一点不加
然后 这BUG&&也是 到%30& & 只是 新 插 大的 +成 %40 而已&&那么& &就和 教程的 相同了& &只是 新 插 大的 出BUG而已
主题帖子积分
游戏狂人, 积分 1105, 距离下一级还需 895 积分
游戏狂人, 积分 1105, 距离下一级还需 895 积分
不用重新装技能,技能没BUG。& &bug出在各种突变体上,重新读档就把你的突变体都重新安一下,就好了。
否则法印强度加成会降低。
主题帖子积分
高级玩家, 积分 419, 距离下一级还需 181 积分
高级玩家, 积分 419, 距离下一级还需 181 积分
也不知道怎麼劇情到凱爾莫漢守衛戰后,我的血量多了三倍,攻擊力漲了近十倍........
Powered by

我要回帖

更多关于 卡牌 攻击力 防御力 的文章

 

随机推荐