15th-day

 · 2019-8-14 · 次阅读


40.SKCTF管理系统(http://123.206.31.85:49163/)
  进入页面后是一个管理系统的登陆界面,这里没有账号和密码先去注册一个,任意注册一个后提示不是管理员还想得到flag,太真实了,这里可以想到题目中提示了是约束攻击因而先去了解一下约束攻击,借其他大佬的博文中的文章来说明一下:
  先插入username和password并限制长度都为20,可以看到我们插入的语句是可以查询到的,这里有一个问题就是因为我们在前面限制了插入的字符串的长度,所以超出的部分是没有办法插入数据库的,所以如果插入一条的用户名为‘admin 很多空格 ’,那么对于数据库而言中间的空格被忽略掉了,而且整个串的长度超过了限制的20,所以多的部分被截断,那么我们就可以用这个刚创建的用户登陆admin账户。
这道题就是约束攻击的一个经典例子,后台肯定会约束用户名的长度的,一般来说admin就是管理员权限,很明显,我们注册时,例如我就注册了’admin 25个空格 ‘然后再回去登陆就拿下了flag.
  summary:这道题主要是让我们了解关于约束注入的意思,我理解的大致就是由于管理员在设置所有登陆用户和密码都会约束长度,而sql查询的一个特点是超过长度的查询会截断后半部分的内容,因而可以通过这点注册管理员admin账号+很多空格,这样就成功伪造了admin登陆,但这仅仅是这道题的限制没有做,按理说注册时就应当限制用户名长度这样也不会超过限制长度导致sql约束攻击。
sql约束攻击的防御手段:
防御手段

毫无疑问,在进行软件开发时,需要对此类安全漏洞引起注意。我们可采取以下几项措施进行防御:

将要求或者预期具有唯一性的那些列加上UNIQUE约束。实际上这是一个涉及软件开发的重要规则,即使你的代码有维持其完整性的功能,也应该恰当的定义数据。由于’username’列具有UNIQUE约束,所以不能插入另一条记录。将会检测到两个相同的字符串,并且INSERT查询将失败。

最好使用’id’作为数据库表的主键。并且数据应该通过程序中的id进行跟踪

为了更加安全,还可以用手动调整输入参数的限制长度(依照数据库设置)