marker_102吧 关注:4贴子:929
  • 3回复贴,共1

【学习之渗透注入】手工注入php+MySQL参数,技巧和描述

只看楼主收藏回复



1楼2013-06-29 09:28回复
    注入这个词自从数据库与动态脚本诞生至今日,一直是黑客们乐不此彼的谈论话题,现在Injection的思想已经不仅仅限于SQL当中,File Include,Command Execution等等,已经延伸到了WEB入侵的各种手段中。
    我想要说的并不是如何去注入一个网站,而是注入的原理。
    作者:Juliet @ Silic Group
    本篇文章我要讲的内容,和《[黑客攻防 零基础学习]什么是注入 Whats SQL Injection?》一样,属于最基础的课程,看了前面那篇,再看这篇,循序渐进
    先讲关于mysql数据库的user表段
    MySQL无论4.x还是5.x,都有一个独立的数据库,名字就叫“mysql”,当中有很多数据表,保存MySQL的各种设置参数。其中user表段设置了MySQL中数据库用户的部分信息。
    user表段中,user字段为用户登陆名,可以有相同的名字重复
    password字段为登陆密码哈希,是40位的密文,类似于md5
    host字段设置的是这个用户可以在哪些机器上登陆,如果为localhost表示只能是本机登陆,host可以是数据库ip也可以是数据库服务器的名称,例如“mysqldbserver”之类。若host为“localhost”不一定表示没有希望,如果服务器某个网站装有phpmyadmin这个软件的话,仍然是可以利用的
    file_priv字段规定了这个用户是不是可以读取硬盘里面的文件,设置为Y则表示允许,设置为N则表示禁止。
    然后讲MySQL注入中常用的一些参数。


    本楼含有高级字体2楼2013-06-29 09:29
    回复
      参数:
      注入语句的格式为:
      union+select+1,2,3,XO,4,...n+from+XXOO复制代码参数的使用位置为上述语句中的XO位置,有的参数可搭配使用,例如concat(user,0x3a,version)
      user()
      数据库的用户,格式为 user @ server 例如 root@ localhost 通常最高管理账户为root,服务器以localhost也就是本地居多,也可以是服务器名例如mysqldbsever,也可以是ip例如192.168.100.111
      所有的user,都会在mysql数据库的user表段中记录,用于设置权限等
      database()
      当前数据库名,网站建设者任意给予的数据库的名称
      version()
      当前使用的数据库的版本,通常为4.x或者5.x,更低版本没遇到过,存在更高级的6.x的版本,版本最后通常会表明系统的版本,例如5.x.x-nt表示nt(windows)系统下使用的mysql版本
      @@datadir
      数据路径。数据库储存数据总要有个路径放数据,就是这里了。windows常用,通常用于load_file时猜测网站路径等。例如c:\program files\mysql5\data\
      concat()
      联合数据。和联合函数union不同,union用于联合两条SQL语句,这个用于联合两条数据结果。通常是联合两个字段名,在错误回显注入法中,这个函数会联合更复杂的,以后会讲。
      数据库中管理员通常有登录名和密码等多个字段,用concat轻松一次注入出来。例如concat(username,0x3a,password),不同字段用逗号,隔开,中间加一个hex编码值。
      冒号进行hex编码(不知道这个编码的自己Google)得到0x3a,放在concat里面注入以后就显示冒号(自己试验),常用的有0x3a,0x5c,0x5f,0x3c62723e等
      group_concat()
      用法与上面类似,通常格式如下:group_concat(DISTINCT+user,0x3a,password),group_concat顾名思义,如果管理员账号不止一个的话,concat一次只能注入出来一个,进行依次注入显然太慢,于是使用group_concat把多条数据一次注入出来。DISTINCT我就不赘言了,你自己试验一下或者Google一下就行,很简单。
      concat_ws()
      用法类似
      hex()和unhex()
      有一些注入点由于数据库中对数据字段的类型定义,可能不支持union来显示某些不同类型的内容,所以使用hex对数据进行hex编码,例如union+select+hex(password)+from+mysql.user
      注入出来的数据全都是0x1234567890abcdef类似的数据,使用winhex等工具转换回编码即可
      hex参数可用于任何参数外面,hex(concat(xxoo)),hex(user()),hex(database())
      load_file()
      这是MySQL以文本方式读取文件的参数,例如:linux系统的网站load_file('/etc /passwd')或者windows系统的网站load_file('c:\\boot.ini')
      这个参数可以用的前提是,你user()得到的用户名(参见关于mysql.user表介绍),在mysql.user表中的字段file_priv设置为Y,则load_file()参数则可用
      需要注意的是,如果为windows系统,保险起见将路径设置为双斜杠\\ 因为在计算机语言中双斜杠才是单斜杠的意思,如果为单斜杠,例如d:\table,那么这个路径中得\t就会被解析为键盘上的tab键,\n\r类似,最终得不到想要的结果
      很多时候,php的网站的gpf会设置为on(就是对特殊字符做修改,例如单引号'自动修改为\'),那么load_file('c:\\boot.ini')就变成:load_file(\'c:\\\\boot.ini\')出现语法错误,得不到结果
      解决方法就是,和concat参数一样,hex混用,将c:\\boot.ini进行hex编码,得到:0x633a5c5c626f6f742e696e69,原语句修改为:union+select+1,load_file(0x633a5c5c626f6f742e696e69)即可
      使用load_file参数后面可以不加from
      select XXOO into outfile '路径';
      这种用法基本没太有用,但是仍然有遇到过。用法就是+union+select+webshell的hex编码+into+outfile+'网站屋里路径\\a.php';
      前提是gpf设置为off,有注入点,权限很大,file_priv设置为Y,已知网站路径。虽然条件苛刻,不过仍然就是有很多2B管理员创造了这样的条件


      本楼含有高级字体3楼2013-06-29 09:29
      回复
        关于几点需要注意:
        注入时,猜字段爆数据,有时候会遇到一些网站编写者在原始语句后面加一些语句例如order by啊desc啊等等,例如
        SELECT 1,2,3,4 FROM news where id=1 ORDER BY date DESC复制代码注入语句以后:
        select 1,2,3,4 from news where id=1 union select 1,2,3,4 from admin order by date DESC复制代码admin表中没有date字段,如何DESC?这就容易出现,不管你怎么注都会提示错误。
        所以,通常注入的时候,在语句最后加一个--横杠或者/*注释符,结束后面的语句
        就是这样:
        news.php?id=1+union+select+1,2,3,4+from+admin--
        news.php?id=1+union+select+1,2,3,4+from+admin/*复制代码注入时,union联合了前面和后面两个语句,系统到底执行哪个呢?这个你不要担心,只要前面那个出现了逻辑错误,union一定执行后面一个注入的SQL语句
        之前说过逻辑错误,也就是and+1=2,计算机中1不可能等于2,那么就逻辑错误了。
        但是,因为浏览器地址栏有限,有时候写不开那么多1234数字等等(最多我见过300多个字段的),那么想要废除1=2?简单
        你之前应该发现了,我通常将地址栏上面的id=写成等于负一,news.php?id=-1
        id通常都是正整型的,哪有负数,0都没有,所以写-1或者0,和and 1=2是一样的效果,都是逻辑错误,前面等于负数发生逻辑错误了,union自然100%的无悬念的执行union后面你插入的SQL语句了


        本楼含有高级字体4楼2013-06-29 09:29
        回复