Less-42
基于存储_POST_单引号_字符型_堆叠注入
这一关看起来和Less-24是一样的界面,实际上是不同的,我们点击 New User click here?可以看到如下:
翻译:你需要创建帐户然后侵入
通过这一关我们了解到了,我们无法进行注册和忘记密码的操作。
我们在Less-24做这种界面的关卡的时候是二次注入,通过越权修改别人的密码,我们这里还是一样,只是改为使用堆叠注入。还要注意的一点是,这里的数据是Post数据,所以我们的注释符需要使用#,而不是--+。(输入框中不要用--+是因为+不会进行url编码,因为他不在url地址栏中,可以使用 # %23 -- #)
分析源代码:
主要分析login.php
嗯,竟然输出报错信息,那妥妥的报错注入也可以,但这不是我们这一关想要表达的注入:
这里我们试一下报错注入:
-1' union select 1,database(),3#
当然我们看到有个update_password 是否可以像less-24那样实现越权修改别人的密码,当然是不可以的,上源码
看到没有都进行过滤了。
Update 更新数据后,经过 mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化。在 select 调用的时候才能发挥作用。所以不用考虑在更新密码处进行注入,这关和二次注入的思路是不一样的。
最重要的是二次注入是需要把注释符保存到数据表中,虽然堆叠注入能插入用户名和密码,但是注释符的是没办法进行保存的,会注释掉后面的语句导致该语句不完整而出错。
开始我们的注入:
这里网上的大部分包括《注入天书》只写了如何创建与删除一个表,只能说存在堆叠注入,然而好像没什么用处。
这里仍像 Less 38 - Less 41 一样,创建新的用户信息(即插入数据 / 注册)。
因有 MySQL 报错信息,可以看出是单引号闭合。
1';insert into users(id,username,password) values(42,'Less42','Less42')#
可以简写:1';insert into users values(42,'Less42','Less42')#
返回这个页面不用管它:
直接查看数据表:
OK,成功创建了我们的用户
当然使用:
1';update users set password='hello' where username='Dumb' #
作为登录密码,修改Dumb密码。
顺便说一下我为什么不修改用户Less-42的密码是因为,php的过滤函数会过滤掉字符 -
还有一点需要注意的是,但对这一关而言,这条语句很重要,注释掉这条语句,那么你就得通过其他方法来判断这一关是什么类型的注入,然后需要得到users数据表,过程会比较繁琐。最后才能进行堆叠注入。
----------------------------------------------------------------------
Less-43
基于存储_POST_单引号_小括号_字符型_堆叠注入
本关与 42 关的原理基本一致,我们还是定位在 login.php 中的 password。看一下 sql 语句为:
还有有 MySQL 报错信息的代码:
登录:username:admin
Password:1');insert into users values(43,'Less43','Less43')#
可以看到添加了 less43 这一项数据:
-----------------------------------------------------------------
Less-44
基于存储_POST_单引号_字符型_盲注_堆叠注入
本关是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与 42 关的区
别就在于没有报错信息,当 POST 没有报错回显时,判断查询语句就需要构造永真条件同化登录失败与查询出错,通过返回的图片不同来确定是否符合查询语句闭合的条件:
如果登录失败,可以看到这样的页面:
登录成功是这样的页面:
(这里我使用的是万能密码: 1' or 1=1#)----这里对用户名进行了过滤,为了方便我使用了后台已有的用户名,当然我们也可以利用前面学到的宽字节注入来绕过,具体看前面的文章。
即:用户名:Dumb
密码 :1' or 1=1#
那么我们可以在Burpsuite中进行测试来判断字符类型:(具体步骤可参考Less-15)
(ps:不知道为什么下面的单引号测试语句无法在火狐插件HackBar中执行成功,哪怕换了注释符也不行,特意用Burpsuite看了下提交的数据没什么问题,但就是不成功,使用Burpsuite提交一点问题都没有,看来插件的功能有限啊,怀疑是插件版本的问题,该升级了。。。)
login_user=admin&login_password=1 or 1=1--+
login_user=admin&login_password=1' or 1=1--+
login_user=admin&login_password=1" or 1=1--+
login_user=admin&login_password=1') or 1=1--+
login_user=admin&login_password=1") or 1=1--+
经过测试我们知道是单引号字符类型,然后获取到数据表,
接着,我们使用同样方式的 payload:
1';insert into users values ('44','less44','hello')#
---------------------------------------------------------------
Less-45
(PS:现在翻译越来越不准确了)
基于存储_POST_单引号_小括号_字符型_盲注_堆叠注入
同样的,45 关与 43 关的 payload 是一样的,只不过 45 关依旧没有报错信息。
1');insert into users(id,username,password) values(45,'Less45','Less45')#