SQL注入原理及联合查询

1、SQL注入原理:

用户输入的数据被当做SQL语句进行执行

条件:①用户能控制输入的数据

        ②原本程序要执行的代码,拼接了用户输入的数据然后执行

如何检测SQL注入:

①:and 1=1  页面正确

and 1=2  页面错误  可能存在SQL注入

②:字符运算法:+ - * /  (+号需要URL编码之后再传入,GET传参会把+号当做空格来处理)

例如:id=2-1 跳到了id=1的页面,那么就一定存在SQL注入(正常情况下网站是不会进行运算的)

检测出存在SQL注入之后,下一步就是拿到数据库的信息或者拿到数据库权限

如何通过SQL注入获取数据库信息:

联合查询法:

A语句 union B语句

        把两条SQL语句一起去执行(字段数要相同)

order by 排序

order by 1 以第一个字段进行排序  可以用来查询字段数

假如一个表里面只存在两个字段,那么order by 3 页面就会报错

union select 1,2,3  查看回显点

由于一般情况下,页面只显示第一条数据,所以如果我们想要吧第二条数据显示出来,我们就需要让前面的语句报错

由于数据库会选择输出,而这个选择输出的输出位,就是我们想要的回显点

我们想要的信息,都要从这个回显点来输出出来

下面用靶场来演示一下

进入靶场,在URL栏处输入and 1=1页面正常 and 1=2 页面显示不正常

 

 

接下来判断字段数

order by 1正常  order by 2 正常  order by 3正常 order by 4 页面不正常,说明存在3个字段

 

 

union select 1,2 ,3查看回显点,可以看到回显点是2和3这个地方

 接下来就是查询数据库的库名,需要用到database()这个函数,将这个函数直接写到回显点的位置上面,可以看到数据库名是security

 接下来就是查询数据库的表名

查询表名有两种方法,一种是猜,在URL栏处输入union select 1,2 ,3 from user 如果页面输出的是正常,那么就是存在,如果页面显示错误,那么就是没有这个表,如下图user不存在,users存在

另一种是利用系统自带库来查询表名

mysql 5.0 以上的版本有一个系统自带库,information_schema,里面存储着tables和columns

tables 里面是数据库中库和表的对应,上面我们已经知道了库名security,我们也猜出来了一个表名users,我们可以在tables里面看到,这个库和表的对应

图中我们可以看到表名对应的是table_name,库名对应的是table_schema

库.表.字段的结构  a.b.c就表示选中a库里面的b表里的c字段

那么我们想要知道其他的表名,就可以利用数据库的查询语句结合这个information_schema来获取其他的表名,构造语句:select table_name from information_schema.tables where table_schema=database()

现在将这个我们构造好的语句拼接到我们之前得到的回显点上面,and 1=2 union select 1,2, table_name from information_schema.tables where table_schema=database(),我们就可以看到表名了

 由于页面只显示第一行的数据,想要看到其他的表名,我们就需要用到 limit 这个函数

limit 0,1 表示输入第一行的数据,输出一行 0表示从第一行开始输出  1表示第一行

limit 从第几行开始输出(默认0),输出几行数据

现在我们想要看到其他的数据,我们只需要在原来的语句中将limit拼接上就好了,and 1=2 union select 1,2, table_name from information_schema.tables where table_schema=database() limit 0,1,我们只需要改变0这个数字,就可以得到我们想要的表名

接下来就是查询字段名了,上面讲到了有一个系统自带的columns,这个就是数据库中的库和表和字段的对应,上面我们已经知道了库名security,我们拿到了一个表名emails,我们可以在colunms里面看到,这个库和表和字段的对应

 图中我们可以看到字段名对应的是column_name

我们就可以根据上面构造查询表名的经验来构造查询字段名的语句,select column_name from information_schema.colunms where table_schema=database() and table_name='emails'

这个语句的意思就是查询这个字段从information_schema这个库里面的columns去拿,where后面的就是条件,满足查询的这个字段保证在这个库里面(table_schema=database()这个就是security这个库),并且在emails这个表里面

 接下来就是利用limit来获取其他的字段名

知道了库名、表名、字段名,接下来就是拿数据了,利用数据库查询语句,就可以直接拿到数据

select 1,2,字段名 from 表名(select 1,2,id from emails) ,可以看到里面的数据就是1

 真实渗透中或者挖SRC,各位师傅只需要得到库名就好了,完全没必要往下走,一不小心就吃国家饭了,千万不要拿数据。一定要遵守网络安全法!!!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值