前言
本篇将讲解如何利用逻辑语句绕过登录界面,并在绕过登录界面后获得数据库中想要的数据。
题目分析
题目页面如下:
与之前在地址栏中写入SQL语句不同,由于表单是将表单中的内容带入数据库查询,因此我们将在表单内写入SQL语句。
先提交一个单引号试试:
结果如下:
竟然有报错信息,接下来就方便很多了。仔细分析错误信息可以发现语句大致如下:
……username = ’ ’ and password = ’ '
也就是说存在字符型漏洞且闭合符为单引号。但此时我们并没有账号密码,那该如何登录呢?
登录界面绕过
这里需要用到and和or的逻辑判断关系。之前我们提到过,and的两边只有同时为真整体才为真,or的两边只要有一边为真整体就为真。因此我们只需构造如下用户名和密码即可:
usename:a(用户名可随意构造);
password:‘ or ‘1’ = '1 ;
结果如下:
登录成功且打印出了用户名和密码,这个稍后再看。
构造如上用户名之后语句大致如下:
……username=’a‘ and password=’ ’ or ‘1’='1’
and的优先级是大于or的,因此先在数据库中查找是否有:username=a以及password= ,答案是没有,所以为假。再判断or两边真假,左边已经判断过为假,而右边1恒等于1,所以整个语句为真。表单查询结果返回为真,因此尽管用户名不存在、密码为构造的SQL语句依旧能登录成功。
绕过登录界面后获得库中内容
接着再看回来登录成功的页面,重点在画红圈的内容:
你顿时觉得很熟悉,总感觉在那见过。是的没错,这一块跟我们先前在进行联合查询注入时的页面基本一致:
刚才也讲到了,与在地址栏中写入SQL语句相比,登录界面绕过是在表单内写入语句的(实际上就是get和post的区别)。因此我们只需将先前在地址栏中写入的联合查询注入语句写到表单内即可。但目前的表单有两处地方可以写入SQL语句,那写在哪一处呢?
这时就需要用到我们的注释了。我们可以在username中写入SQL语句,接着使用注释符注释掉剩下的password部分即可。笔者采用的注释符为”- -+“,但将空格用加号代替是为了避免在地址栏中进行转码,而在表单中则无须如此,只需使用连续两个减号和一个空格即可。
先确定字段数,在username中写入如下语句:
a‘ union select 1,2 - -
结果如下:
在username中写入以上语句后整个语句大致为:
……username = ‘a’ union select 1,2 # and password = ’ '
加上这个注释符之后,虽然还是在表单中写入语句,但操作上基本与在地址栏中写入语句一致。
总结
实际上在表单中注入与在地址栏中注入二者并无差别,仅仅只是因为写代码时使用地获得参数的函数(get和post)不同导致展现的方式不同罢了。
以上就是本篇的全部内容,我们下篇见。