sqli-labs 1~4 多命通关攻略

  • 第一关
    • 判断是否存在 SQL 注入点
    • MySQL 中的注释
    • 判断 SQL 返回的查询结果中的列数
    • 联合注入
      • 判断显示位
      • 数据库 information_schema 的妙用
      • 对当前数据库中含有的表进行爆破
        • group_concat() 函数的妙用
        • group_concat() 函数的缺点
      • 对某个表中含有的列名进行爆破
      • 对某个表中的字段值进行爆破
  • 第二关
  • 第三关
  • 第四关

第一关

进入第一关后,我们可以看到提示信息 Please input the ID as parameter with numeric value,意在让我们使用参数 id 来作为 GET 提交的参数。

判断是否存在 SQL 注入点

通过报错信息,我们可以发现这里存在一个字符型注入点。

注:

不要被错误信息迷惑了,其中最外层的两个单引号是错误信息为了凸显错误部分而设置的,SQL 代码片段应该是上图中的选中文本部分。

MySQL 中的注释

MySQL 中的注释分为两种,#/**/。其中 # 为单行注释,而 /**/ 则为多行注释。虽然这三种都具有注释的功效,但是每一个都有它的特点,适用于不同的场景之中。

方式 局限
-- 使用 -- 符号对语句注释时,后面不可以紧跟被注释语句,需要有空格将两者隔开,因此常在 -- 后面跟上 +,因为 + 在 URL 中表示空格
# # 在 URL 中表示锚点,# 及其后面的内容是不会提交给服务器的,如果仍想使用该符号完成 SQL 注入,可以使用其 URL 编码 %23 来代替
/**/ 使用这个需要将 */ 放到目标代码(想要注释的代码片段)的后部分,但在注释过程中往往是做不到的

因此,在 SQL 注入过程中,最长使用的注释符号是 --+ (至于为什么有 + 号,想必经过上面的介绍应该是懂的吧)。

判断 SQL 返回的查询结果中的列数

联合(使用 union 关键字实施的注入)注入前,需要先了解返回结果所包含的列数。




在使用如下语句进行注入后,提示报错信息,说明返回结果中包含了 3 列。

?id=1' order by 4--+

联合注入

判断显示位

我们需要判断返回的三列中,哪几列会显示到页面中,于是构造如下语句:

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

显示结果如下:

数据库 information_schema 的妙用

在数据库管理系统 MySQL 中存在一个数据库 information_schema,其中有两个表在 SQL 注入中常常使用到:

描述 字段
tables 提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。命令 show tables from schemaname 的结果便取自此表。 table_schema 可以限定被选定表所属的数据库
columns 提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。命令 show columns from schemaname.tablename 的结果取自此表 table_name 可以限定被选定列所属的表。
对当前数据库中含有的表进行爆破

构造语句获取当前数据库中所有的表的名称:

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

注:
database() 函数返回当前正在使用的数据库的名称。

group_concat() 函数的妙用

group_concat() 函数可以将同属于一个字段的数行记录汇聚到一行中,便于我们对结果的观察。
如果不使用该函数,你可以像这样去观察返回的每一个数据:

  1. 使用 limit 语句
    limit 语句接受两个参数,第一个为偏移量(从 0 开始计数),第二个参数为选取的记录数(从 1 开始)。于是为了选择第四行记录(users),可以构造语句
?id=' union select 1,database(),table_name from information_schema.tables where table_schema=database() limit 3,1--+


为了选择第二行记录(referers),可以构造语句:

?id=' union select 1,database(),table_name from information_schema.tables where table_schema=database() limit 1,1--+


2. 通过 id 直接选中(不可行,但具有教育意义)
由于当参数 id 的值为数字 1~14 时,都会显示一个用户的用户名和密码,而当值为 15 时,查询结果为空。

这说明在使用联合注入查询前共有 14 行记录,于是,为了获取联合查询后的第 18 行记录(即 users),可以构造语句:

?id=18' union select 1,database(),table_name from information_schema.tables where table_schema=database()--+

但好像并不可行

那就试试查询第二行记录

再试试查询第一千行记录

苦想之下,终于得出了一个结论:
当指定的行数在 1~14 的范围内时,我们是在原来的数据中进行查询。而当超出这个范围时,union 前一部分的 SQL 查询结果为空,后一部分的查询结果中的第一行成为这整一个查询语句的第一行,而 where 语句仅作用于前部分语句,所以当我们使 id 的值为 1000 时,MySQL 仍旧没有报错,而是显示了后部分查询结果的第一行,即 emails。因此,第二种方法并不可行。
下面是该页面的部分代码:

group_concat() 函数的缺点

通过上面的介绍,我想各位都会更愿意使用 group_concat() 函数而不是 limit 关键字,因为 group_concat() 函数一次性就可以显示所有内容,而 limit 却只能一个一个的显示。
在遇到上述需要使用 group_concat() 及 limit 的场景时,我不推荐使用其中的一种,应该都用起来。group_concat() 虽然可以一次性显示完全,但如果遇到了存在长度限制,导致部分内容缺失将影响到后续的注入。
假如完整的查询结果是这样的:

emails,referers,uagents,users

而由于网页的设计你只能看到这么一部分内容:

emails,referers,uagents,user

emails,referers,uagents

那么,后续的渗透就有可能会受到影响。

在下一个板块 对当前数据库中含有的列名进行爆破 中同时使用 group_concat() 及 limit 来避免这类情况的发生。

对某个表中含有的列名进行爆破

该数据库中有多个表,我们选择表 users 来进行爆破,构造语句如下:

?id=' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='users'--+


注:
构造的语句中 table_name 的值为一个字符串,所以在构造的语句中,我为 users 添加了引号。


为防止显示的最后一个字段名(password)不是完整的,虽然从英文的角度来说它是完整的,但我们仍然应该试一试。因此,构造语句如下:

?id=' union select 1,database(),column_name from information_schema.columns where table_name='users' limit 5,1--+


这证明了 password 列的列名并没有因为网页的设计而缺失。

接下来我们将构造一个语句判断 password 是否为最后一个列的列名。

?id=' union select 1,database(),column_name from information_schema.columns where table_name='users' limit 6,1--+


结果表明,最后一个列的列名确实为 password,没有列因为网页设计的缘故而显示不全。

对某个表中的字段值进行爆破

这里我将爆破 users 表中的 username 及 password 字段值,在看完后你也可以尝试爆破其他的内容。
构造语句如下:

?id=' union select 1,group_concat(username),group_concat(password) from users--+


当然,你也可以像前面那样同时使用 group_concat() 和 limit 来检测是否有字段值因为网页的设计原因而显示不全。在进行重要的渗透测试时,尤其应该如此,但在这里我就不再演示了。

至此,第一关已被成功攻破。

第二关

为判断是否存在注入点,构造如下语句:

?id='


由返回结果可以判断,该处存在注入点且为数字型注入,因此不需要使用引号进行闭合,其他的与第一关无异。

第三关

同样先来判断是否存在注入点还有注入类型。为此,构造语句如下:

?id='


可以发现,这是一个字符型注入,且在引号外还存在括号。因此,本关需要对引号及括号进行闭合。

例如:

?id=') or 1=1--+

由于或运算符 or 两边中有一边执行结果为 true,所以返回 true。


再构造语句:

?id=') or 1=2--+

由于 or 两边的执行结果均为 false,于是返回 false,故该查询语句将返回一个 empty set。这证明了这样闭合是有效的,其他方面与前两关无异。

第四关

在第四关,我们使用同样的语句来判断注入点类型。

?id='


奇怪的是,并没有产生错误。这说明,SQL 语句并没有被破坏但内容并不符合程序的期待,因此没有返回内容。所以我们可以尝试使用双引号来破坏 SQL 语句的正常结构以使其显示报错信息。
构造语句如下:

?id="


可以看到报错信息了。实现 SQL 注入需要正确闭合双引号和括号。其他部分与前三关无异。

sqli-labs 1~4 多命通关攻略相关推荐

  1. 计算机游戏 25攻略,长生劫游戏过关攻略 长生劫第1-25关通关攻略大全

    长生劫第1-25关通关攻略大全,长生劫的探险是一层层的往后开拓的,为了帮助大家快速通关,给大家准备了 第1-25关通关攻略大全. 1-10层 阵容: 龙+1.胡东+1.赵启天+1.卢吉+1.薇丽杨+1 ...

  2. “掘金”金融AI落地,英特尔趟出一套通关攻略

    有人说,金融业是最大的AI应用场景,但不管怎样,不可否认的事实是金融业已经从数字化走向AI化. 某种程度上,AI与金融业有着天然的契合性:其一,金融业本身就是以数据为基本元素的行业,它为AI的模型训练 ...

  3. CVPR一区审稿人分享:图像分割论文通关攻略

    攻略分两部分: 1.入门   2.创新点及实验优化 配套工具以及学习资源 文末扫码即可免费领取 上个月,一个读者发私信问我,他目前研究方向是图像分割,想弃坑了. 因为实验室就只有他一个人做这个方向,导 ...

  4. 计算机游戏第72关,史上最难的游戏第72关 第72关通关攻略

    史上最难的游戏第72关 第72关通关攻略 2014-04-03 来源: 996手游网 编辑: 帽纸 () 史上最难的游戏是以暴走漫画为游戏剧情及背景,让无数小伙伴们抓狂的游戏.全新的关卡又更新了,为了 ...

  5. 秋招注意事项和面试通关攻略

    首先给大家说声抱歉,最近由于个人工作(突然996)和精力上的原因,导致公众号断更了一段时间,后面会逐渐恢复公众号的更新,在此感谢大家的理解和支持. 国内主流的互联网公司在 8 月份都开放了秋招申请,那 ...

  6. imToken 测评通关攻略

    imToken 测评通关攻略 2017-10-19 imToken 在 1.3.3 版本新增了用户风险测评系统, 目的是为了让更多的用户了解钱包安全知识以及区块链的基本概念, 从某种程度上提升了整个区 ...

  7. 无悔入华夏怎么一直显示服务器,无悔入华夏快速通关攻略

    无悔入华夏怎么通关快呢?下面小编为大家带来无悔入华夏快速通关攻略,一起看看吧. 名臣带的:墨子(墨守加防御),李牧(神,前期点出据守加防御,中期点出另一个加兵,相当于子弟兵),商鞅(拿来治国的),孟子 ...

  8. 首届广西网络安全技术大赛初赛通关攻略

    首届广西网络安全技术大赛初赛通关攻略 前言 第一次参加安全类比赛(好吧,其实我这种宅男参加的比赛都很少,很多种比赛都是第一次 - -),同组的组员建议我在比赛完写个通关攻略出来.听起来不错,写个通关攻 ...

  9. 手机寂静岭 java 攻略_寂静岭PT最终房间进入及通关攻略

    寂静岭PT玩到最后一个房间时,很容易出现不知道怎么进入房间的问题,不少玩家都在论坛.贴吧等地方询问是不是bug导致的.其实这并不是bug,而是大家前期没有触发相关机关.下面小编就给大家介绍一下最终房间 ...

最新文章

  1. 聊聊成为大神路上的过程
  2. 关于机器学习的一些感想
  3. LeetCode 530二叉搜索树的最小绝对值差-简单
  4. Android WiFi开发
  5. python运行出现SyntaxError: 'return' outside function的原因和解决办法
  6. 5.4Irvine32库
  7. qrc路径_c – 在Qt中获取qrc文件的路径
  8. 游戏手柄(JoyStick)的延时处理
  9. 解决 Word 中空格下划线居中后下划线不显示的问题
  10. 「安全系列之CSRF」如何防范csrf攻击
  11. 计算机组成原理(哈工大)学习笔记
  12. java8新特性 Stream流之根据条件过滤统计个数
  13. Python基于逻辑回归的糖尿病视网膜病变检测(数据集messidor_features.arff)
  14. 华硕飞行堡垒系列无线网经常显示“无法连接网络” || 一打开游戏就断网
  15. LINUX基础之 压缩归档篇(二)
  16. webix icon 图标
  17. keras电影评论分类
  18. 程序员快速掌握的UI设计技巧
  19. 使用webpack4 兼容ios8 自动添加前缀
  20. TextView设置字重(自定义自重)

热门文章

  1. 第十一周OJ-Q50解题方法
  2. 怎样删除微信朋友圈的内容?超简单的方法免费分享!
  3. NUCC- Nets Union Clearning Corporation
  4. 小坤二次元炫酷导航HTML源码
  5. Pro Android学习笔记(一五五) 传感器(5) 磁场传感器和方位(上)
  6. Eureka源码-double check单例模式运用
  7. 最近一直在被螺旋槽成型铣刀的计算折磨着
  8. input框输入身份证时实现动态脱敏
  9. chmod777到底是什么意思
  10. 如何将JPG格式图片转换成BMP格式