×

sql注入那些事儿——如何优雅地进行SQL注入(3)

96
程序员Sunny
2018.05.29 00:35* 字数 1007
图片发自简书App

传送门:

sql注入那些事儿——如何优雅地进行SQL注入(1)
sql注入那些事儿——如何优雅地进行SQL注入(2)


看了前两篇的童鞋选择应该对sql注入有一定理解了。不过也有童鞋说这个页面中用户名密码都告诉你了,还sql注入啥呀。其实不然,你可以假设我们要获取的不仅仅是用户名和密码呢,我们sql注入是想要获得比网站可以提供给我们的更多的数据。这里你可以这样理解,密码已经不是密码,就是和用户名一样的一个符号,而我们要去数据库里的emails表里的email才是我们的密码。
今天我们的进度会快一些,争取可以让大家学到更多知识。还是老规矩,我们今天的课程基于sqli-labs lesson 4。先看一下界面:


图片.png

还是一样,提示我们要输入一个数字作为id的参数,那么我们首先还是输入id=1看看情况。


图片.png

结果出来了,还是一样的配方。首先尝试id=1',结果毫无波澜:
图片.png

这就有点意思了,完全没报错。难道是这里不报错了?再试试其他的方式,加个括号啥的。
图片.png

还是没报错,这就很气了,Sunny还是决定将单双引号,括号再试试,包括他们的组合也都试试。终于,功夫不负有心人,双引号会报错。


图片.png

分析报错内容,还是和以前类似,只不过把单引号换成了双引号而已,对聪明的童鞋们来说还是小菜一碟。
 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1 

sql语句剥离出来就是

"1"") LIMIT 0,1

接下来,看过我前两篇sql注入文章的童鞋应该都知道该怎么做了(顶部有传送门)。


接下来,我们还是继续看一下lesson 5。
界面还是一样的帅:


图片.png

输入id=1看看正常页面长啥样:


图片.png

竟然提示信息了!!!这样按照前面的方法,无论如何也显示不出来信息吧?应该只能看到You are in...这样也没啥用啊!
先不管这个,我还是再用id=1'试试,好的,有报错信息:
图片.png

和lesson 1中的信息类似,所以语句应该是一样的,唯一麻烦的就是没有显示我们查询结果的位置。
绞尽脑汁也想不出啥办法,前面的方法也完全失效了。咋办呢?盲注应该可以,但是Sunny还没说到盲注。那么今天就来说说双查询注入,双查询注入是啥,Sunny当时在学习双查询注入的时候,对原理比较好奇,大多数的回答都是“根据研究人员研究发现...”。所以研究人员,究竟发现了什么?这就是今天要说的重点。

简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。

我们就直接来看看双查询注入的基本格式吧。关于双查询具体的内容,可以看Sunny的另外一篇文章sql注入之双查询注入

select count(*),concat_ws(':',([子查询写在这里]),floor(rand()*2)) as a from [table_name] group by a;

这里我们说一下几个函数

rand()

rand()函数是一个生成随机数的函数,他会返回0到1之间到一个值。

floor()

floor()则是取整函数了,童鞋们应该都很熟悉了。

count()

count()则是一个聚合函数,用户返回符合条件的记录数量。

那么我们这里就应用一下双查询语句,为了方便,我们这里不选择闭合单引号了,而是直接选择注释后面的代码:
在这里我也直接给出url格式的payload:

[domain]/Less-5/?id=1' union select 1,count(*),concat_ws(':',(select user()),floor(rand()*2)) as a from information_schema.tables group by a %23

按照上面给出的payload,输入之后回车,发现还是You are in...


图片.png

别着急,这就是拼人品的时候了,只要语句正确,多试几次,总会成功的:


图片.png

这不,话还没说完,已经获取到了user()信息。要获取其他信息,只需要把子查询替换掉即可。
比如:
[domain]/Less-5/?id=1' union select 1,count(*),concat_ws(':',(select group_concat(table_name) from information_schema.tables where table_schema=database()),floor(rand()*2)) as a from information_schema.tables group by a %23

图片.png

最后,想搞清楚具体为什么是这个语句的童鞋,可以看一下我的另外一篇文章sql注入之双查询注入

至此,我们的sql注入教程第三课就到这里了。童鞋们如果有疑问或者想和我交流的话有两种方式:

第一种

评论留言

第二种

邮箱联系:zsunny@yeah.net

原创系列
Web note ad 1