0
点赞
收藏
分享

微信扫一扫

sqli-labs 部分关卡学习心得

颜路在路上 2022-01-10 阅读 20
python

 之所以是部分关卡是因为有一些关卡做完了就忘了截图,于是在后面慢慢补起来...


 less-7 GET - Dump into outfile - String (导出文件GET字符型注入)

本关我们运用outfile可以将语句查询到的信息传入外部文件中。


less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)

(1)首先对注入类型进行判断。图8-1是页面正常回显时显示的页面,我们添加单引号发现页面出现变化,如图8-2,于是我们能够知道页面正确与不正确时两种状态的显示情况。

8-1

8-2

(2)接下来我们让语句闭合,末尾先加上‘--+’注释掉后面的符号,发现页面为正确回显,语句闭合,如图8-3,可以进行注入了。

 8-3

(3)因为页面没有错误回显信息,所以我们选择用布尔型进行注入,通过判断来得到数据库名等信息。

首先判断数据库长度,语句为 

?id=1' and length(database())= 8--+

其中8为最终得出的数据库长度,在进行尝试时可以从任意数字开始尝试,当页面为正确回显证明数据库名长度为该数字长度,如图8-4.

 8-5

 (4)我们运用同样的思路对数据库名进行猜测,语句为

?id=1' and left(database(),1)='s'--+

这句语句判断数据库左数第一个字符是否为s,若页面正确回显,则证明为s。 

最终得出数据库名为‘security’。如图8-5.语句为

?id=1' and left(database(),8)='security'--+

 8-5


less-9 GET - Blind - Time based. -  Single Quotes  (基于时间的GET单引号盲注) 

(1)我们发现不论输入什么页面回显都是一样的,所以在这里我们选择时间延迟型注入,通过页面刷新的时间来判断是否输入正确,如果输入正确的话则会执行sleep函数,页面刷新时间会变慢。最终我们可以通过语句来得出需要的信息。

?id=1' and if(length(database()=4),sleep(5),1)--+

 比如通过如上代码可以得出数据库的长度。

9-1


 less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)

与上题相同,只需要将闭合方式中的单引号变成双引号即可。


less-21 Cookie_Base64 报错注入

(1)首先我们还是要进行注入点的判断并且找出闭合方式,第一次登录时进时进行了正常的登录发现会显示cookie,所以猜错存在cookie注入,我们使用burp进行抓包,第一个包没有cookie,放包后发现第二个包中有cookie,验证猜想。观察到cookie后的字符是base64编码,我们只需要在输入完注入语句后将语句进行base64转码即可。

(2)我们输入语句进行注入,语句为

转码前 
)' and updataxml(1,concat(0x7e,database(),0x7e),1)
转码后
KScgYW5kIHVwZGF0YXhtbCgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSksMSk=

需要注意的是,在进行注入时应将=后面原来的内容删除。 

结果得出数据库名称。


less-23 

其实less-23根之前的less-1~less-4一个思路,但是注释符‘--+’和‘#’被注释掉了,所以构造单引号闭合就可以,语句为

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() or '1'= '1


less-24 Second Order Injection(二次注入)

(1)首先我们还是需要先观察页面,发现有注册按钮,我们直接注册一个新的用户,用注册的新用户登录页面,发现进入之后是修改密码的页面,我们想到可以进行二次注入攻击。

 

 二次注入攻击的原理:我们能够通过注册向数据库中插入语句,而数据库不对自身加入的语句在输入时进行验证的话则会自动默认语句安全,当执行时会原句执行,这时恶意代码将被执行。

(2)根据二次攻击的原理我们进行操作,我们再次注册一个新的用户名叫test1'#,将该用户登录,对密码进行修改,但这时因为我们构造了闭合,所以数据库在执行时认为是在修改test1的密码,检验一下发现test1'#的密码没有改变,但test1的密码变成了刚才修改的密码,实现了二次注入攻击。


less-26-less-28a 

这里将注释、空格、select、union等查询字符都过滤掉了,我们只需要将这些被过滤掉的字符替换掉就可以对过滤进行绕过,绕过方法只需要构造出闭合语句 即可完成注入。


less-29~less-31

这里需要用到的原理为服务器(两层)架构,进行注入时要为两层架构都提供参数,第一层架构为Tomcat,在解析时解析第一个参数,第二层为Apache,解析时解析第二层参数。我们对第二层架构进行注入,步骤与单架构时一样(less-1~less-4),判断注入点构造语句闭合。只是参数要传入两个。


less-32~less-37 宽字节注入

less-32~less-37使用了GBK编码,就可以利用宽字节注入。

宽字节注入的原理是mysql在GBK转码时默认两个字符为一个汉字,利用这一原理可以添加字符使得加入的单引号或双引号与\构成一个汉字,这时的单引号或双引号将被当做汉字处理,从而达到过滤效果。以less32为例

 可以看出单引号被过滤。我们可以同样利用这一原理,将过滤用的字符与其他字符构成汉字,这时候单引号就会单独被作为字符处理了。

语句为

?id=0%aa%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+

即可完成注入。

 less-32~less-37的其他关卡区分get和post类型,post类型需要用到burp工具。原理一致只是构造闭合时字符需要进行改变。


less-38~less-41 堆叠注入

堆叠注入原理:堆叠注入其实是在说sql语句是以;来区分一句语句是否结束的,若我们使用堆叠注入来进行注入,那我们可以通过;实现多语句的注入,而区别于union联合查询,union后因为要进行参数个数的匹配所以只能使用select语句,而堆叠注入可以注入任何语句,我们可以通过这医原理实现新建数据库、对数据库数据增删改查等一系列操作。

以less-38为例。

使用堆叠注入,语句为

?id=1';update users set password='123456' where username='Dumb'--+

可以看到开始Dumb的密码为1234,注入后密码成功被修改,注入成功。(执行后需再次刷新页面才能显示更新后数据)

 less-38~less-41其他关卡原理相同。


less-46~less-53 order by注入

解题思路:通过观察页面回显,发现是一个根据sort属性进行排序的表格,排序时使用了order by,所以不能使用union进行注入,我们可以利用时间延迟注入和报错注入以及文件写入的方式得到想要的信息。

以less-46为例。

有错误回显,可以使用报错注入,也可以进行时间延迟注入,这里选择时间延迟注入,语句为

?sort=3%20and%20if(left(database(),1)=%27s%27,sleep(5),1)#

通过回显速度可判断出需要的信息。


 less-54

这一关只有10次尝试的机会,最终需要提交秘钥。

(1)第一次尝试我们进行单引号的添加,发现页面没有错误回显,所以不能使用报错注入,同时说明构造闭合时跟单引号有关。因为次数的限制,所以我们不利用时间延迟进行注入。

(2)接着我们测试回显位置以及尝试构造闭合。

语句为

?id=999' union select 1,2,3 --+

 (3)然后我们就可以进行一系列的爆库爆表操作。

爆库语句 ?id=999' union select 1,database(),3 --+
爆表语句 ?id=999' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='chanllenge'--+
爆列语句 ?id=999' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='r3ucjm66up'--+

最终输入语句

?id=999' union select 1,database(),secret_4FU1from challenges.r3ucjm66up--+

得到秘钥,成功破解。


举报

相关推荐

0 条评论