by使得查询效率提高500倍www.weide1946.com,php注入祥

2019-08-03 14:26 来源:未知

SQL注入实例
1.select语句
一般性大家在用户登录的时候,SQL语句如此写法:
$sql=select * from users where userName='{$_POST['unm']} '

正文首借使为小菜们服务的,假设你早正是多头老司机呢,或然有个别事物会感到相比较平淡,但如果你留神的看,你会意识好些个风趣的东西哦。

加个order by使得查询效能增高500倍,order500倍

很轻易的四个表:

p248_user记录用户音讯

CREATE TABLE `p248_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`list_ids` varchar(4000) NOT NULL DEFAULT '',
`email` varchar(255) NOT NULL,
`mobile` varchar(20) NOT NULL,
`_created` datetime NOT NULL,
`_updated` datetime NOT NULL,
`hb_status` tinyint(4) DEFAULT '0',
`sb_status` tinyint(4) DEFAULT '0',
`unsubscribe_email_status` tinyint(4) DEFAULT '0',
`unsubscribe_sms_status` tinyint(4) DEFAULT '0',
`hb_time` datetime DEFAULT NULL,
`unsubscribe_email_time` datetime DEFAULT NULL,
`unsubscribe_sms_time` datetime DEFAULT NULL,
`_create_operator_name` varchar(100) DEFAULT NULL,
`_update_operator_name` varchar(100) DEFAULT NULL,
`_create_operator_email` varchar(100) DEFAULT NULL,
`_update_operator_email` varchar(100) DEFAULT NULL,
`name` varchar(255) NOT NULL DEFAULT '',
`time` varchar(255) NOT NULL DEFAULT '',
`year` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `u1` (`email`,`mobile`) USING BTREE,
KEY `_updated` (`_updated`),
KEY `mobile` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=5596286 DEFAULT CHARSET=utf8

p248_list记录组信息

CREATE TABLE `p248_list` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`status` enum('active','delete') DEFAULT 'active',
`_created` datetime NOT NULL,
`_updated` datetime NOT NULL,
`user_count` int(11) DEFAULT '0',
`lock_status` int(11) NOT NULL DEFAULT '0',
`lock_reason` varchar(100) DEFAULT NULL,
`lock_time` datetime DEFAULT NULL,
`import_percent` int(11) DEFAULT NULL,
`hb_count`www.weide1946.com , int(11) DEFAULT '0',
`sb_count` int(11) DEFAULT '0',
`unsubscribe_email_count` int(11) DEFAULT '0',
`unsubscribe_sms_count` int(11) DEFAULT '0',
`_create_operator_name` varchar(100) DEFAULT NULL,
`_update_operator_name` varchar(100) DEFAULT NULL,
`_create_operator_email` varchar(100) DEFAULT NULL,
`_update_operator_email` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `_updated` (`_updated`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8

p248_user_list是个多对多的表,记录用户属于怎么组

CREATE TABLE `p248_user_list` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`list_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_list_id` (`user_id`,`list_id`),
KEY `list_id` (`list_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5646298 DEFAULT CHARSET=utf8

 

 

p248_user有200万条记下, p248_user_list有1000万条记下。

 

后天要找寻属于29分组,并且手提式有线电电话机号码不为空,并且未有退订的用户。那样的用户差不离有100万个。今后要把那个用户依据五千个一群放权一批一时的记录集里。

 

那几个要用到分页了,一起初的主张:

第一页:

SELECT `id`, `email`, `mobile`, `_created`, `_updated`, `_create_operator_name`, `_update_operator_name`, `name`, `time`, `year` FROM `p248_user` WHERE 1 = 1 AND id IN (SELECT DISTINCT user_id FROM `p248_user_list` WHERE list_id IN (29)) AND unsubscribe_sms_status = 0 AND mobile <> '' LIMIT 0, 4000;

其次页就LIMIT 六千, 5000。第三页就LIMIT 7000, 4000。依次类推。

结果那么些SQL查询耗费时间用了整套5秒。

 

深入分析一下以此查询:

mysql> explain SELECT `id`, `email`, `mobile`, `_created`, `_updated`, `_create_operator_name`, `_update_operator_name`, `name`, `time`, `year` FROM `p248_user` WHERE 1 = 1 AND id IN (SELECT DISTINCT user_id FROM `p248_user_list` WHERE list_id IN (29)) AND unsubscribe_sms_status = 0 AND mobile <> '' LIMIT 0, 4000;
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- -------- ------------------------------------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- -------- ------------------------------------
| 1 | SIMPLE | p248_user | range | PRIMARY,mobile | mobile | 62 | NULL | 934446 | Using index condition; Using where |
| 1 | SIMPLE | p248_user_list | eq_ref | user_list_id,list_id | user_list_id | 8 | contacts.p248_user.id,const | 1 | Using index |
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- -------- ------------------------------------
2 rows in set (0.00 sec)

能够看看用户表扫描了93万行,大致是全表扫描了。相当于把装有符合条件的结果都取了出来然后再取前四千条。

 

 

把地点的询问加上了OENVISIONDEHaval BY `id`,结果查询耗费时间仅0.01秒,查询速度至少加强了500倍。

缘何会如此啊?

剖析一下新的询问:

mysql> explain SELECT `id`, `email`, `mobile`, `_created`, `_updated`, `_create_operator_name`, `_update_operator_name`, `name`, `time`, `year` FROM `p248_user` WHERE 1 = 1 AND id IN (SELECT DISTINCT user_id FROM `p248_user_list` WHERE list_id IN (29)) AND unsubscribe_sms_status = 0 AND mobile <> '' ORDER BY `id` LIMIT 0, 4000;
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- ------ -------------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- ------ -------------
| 1 | SIMPLE | p248_user | index | PRIMARY,mobile | PRIMARY | 4 | NULL | 7999 | Using where |
| 1 | SIMPLE | p248_user_list | eq_ref | user_list_id,list_id | user_list_id | 8 | contacts.p248_user.id,const | 1 | Using index |
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- ------ -------------
2 rows in set (0.00 sec)

此番用户表仅扫描了七千行。也正是查询先利用了主键索引,扫描完前6000条符合条件的笔录就直接截止了。

 

 

那取第二页呢:

mysql> explain SELECT `id`, `email`, `mobile`, `_created`, `_updated`, `_create_operator_name`, `_update_operator_name`, `name`, `time`, `year` FROM `p248_user` WHERE 1 = 1 AND id IN (SELECT DISTINCT user_id FROM `p248_user_list` WHERE list_id IN (29)) AND unsubscribe_sms_status = 0 AND mobile <> '' ORDER BY `id` LIMIT 4000, 4000;
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- ------- -------------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- ------- -------------
| 1 | SIMPLE | p248_user | index | PRIMARY,mobile | PRIMARY | 4 | NULL | 15999 | Using where |
| 1 | SIMPLE | p248_user_list | eq_ref | user_list_id,list_id | user_list_id | 8 | contacts.p248_user.id,const | 1 | Using index |
---- ------------- ---------------- -------- ---------------------- -------------- --------- ----------------------------- ------- -------------
2 rows in set (0.00 sec)

这一次将在扫描15000行了,因为前陆仟条是第一页的没用扔掉了。

 

 

那样的话页数越大查询就能够越耗费时间。

 

 

但其实能够换个情势:

先是次询问甘休时,获得最后一条记下的user id, 举个例子是6500。

第壹回询问的时候用这一个user_id作为基准去匹配

SELECT `id`, `email`, `mobile`, `_created`, `_updated`, `_create_operator_name`, `_update_operator_name`, `name`, `time`, `year` FROM `p248_user` WHERE id > 6500 AND id IN (SELECT DISTINCT user_id FROM `p248_user_list` WHERE list_id IN (29)) AND unsubscribe_sms_status = 0 AND mobile <> '' ORDER BY `id` LIMIT 0, 4000;

如此那般扫描的行数和第一页依然是一律的。

以至于最终一页也是那般,耗费时间不会有任何显然的低沉。

 

by使得查询作用增高500倍,order500倍 非常粗大略的八个表: p248_user记录用户音信 CREATE TABLE `p248_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `li...

至关重要是用来检查那几个用户是还是不是存在,

翻阅此文你只要知道上面包车型大巴那点东西就够了。

要是说我在用户名一栏填上: 1=1 or 1='1'
那便是说sql语句就造成了:
select * from users where userName=1=1 or 1='1';
您填上去试试看?能够轻便绕过阐明,同样密码在输入的时候也足以如此做法

1.精通php mysql情形是如何搭建的。
2.大概理解php和apache的安插,首要选用php.ini和httpd.conf
而此文大家第一选拔的是php.ini的配置。为了安全起见大家一般都开辟php.ini里的平安形式,即让safe_mode = On,还恐怕有贰个便是回到php推行错误的display_errors 那会回去非常多卓有成效的音讯,所以大家应该关闭之,
即让display_errors=off  关闭错误展现后,php函数实践错误的新闻将不会再展现给用户。
在php的安顿文件php.ini中还应该有三个不行关键的布局选项magic_quotes_gpc,高版本的默许都是magic_quotes_gpc=On,独有在本来的古董级的php中的
暗许配置是magic_quotes_gpc=Off,然则古董的事物也许有人用的哦!
当php.ini中magic_quotes_gpc=On的时候会有如何景况时有产生呢,不用恐慌,天是塌不下去的呀!它只是把提交的变量中存有的 ' (单引号), " (双引号), (反斜线) 和 空字符会自动转为含有反斜线的转义字符,比如把'形成了',把变成了\。
便是那点,让大家很不爽哦,非常多时候大家对字符型的就只可以说BYEBYE了,
但是不用气馁,大家依旧会有好格局来应付它的,往下看咯!
3.有必然的php语言基础和了然部分sql语句,那么些都很简短,大家用到的东西比比较少,所以充电还来的及哦!

还是能如此填法:%1,大概*1,,只要以通配符开端都足以绕过证实

我们先来拜访magic_quotes_gpc=Off的时候大家能干些啥,然后咱们再想艺术搞一搞magic_quotes_gpc=On的情事哈

2.通配符

一:magic_quotes_gpc=Off时的注入

<form method=“POST” action=“<? echo $PHP_SELF; ?>“>
<input type=“text” name=“search”><br>
<input type=“submit” value=“Search”>
</form>
<?php
………
SELECT * FROM users WHERE username LIKE ‘%$search%’ ORDER BY username
…….
?>

ref="" target=_blank>攻击
magic_quotes_gpc=Off的情状固然说很不安全,新本子默许也让
magic_quotes_gpc=On了,可是在非常多服务器中大家还发掘magic_quotes_gpc=Off的情况,例如www.qichi.*。
再有某个程序像vbb论坛固然你布署magic_quotes_gpc=On,它也会自动清除转义字符让我们有隙可乘,所以说
magic_quotes_gpc=Off的流入形式依然大有市肆的。

’%’正是通配符,别的的通配符还应该有’*’和’_’,其中" * "用来相称字段名,而" % "用来相称字段值,注意的是%必须与like一齐适用,还应该有三个通配符,便是下划线" _ ",它表示的情致和方面不一致,是用来合作任何单个的字符的。在上头的代码中大家用到了’*’表示回去的享有字段名,%$search%代表全部满含$search字符的源委。

上边大家将从语法,注入点 and 注入类型多少个地点来详细讲授mysql+php注入

在表单里提交
Aabb%’ or 1=1 order by id#
注:#在mysql中意味着注释的野趣,即让后边的sql语句不实践,前边将讲到。
莫不有人会问何故要用or 1=1吧,看上面,
把提交的内容带入到sql语句中成为

A:从MYSQL语法方面先
  1。先讲一些mysql的主干语法,算是给未有好好学习的男女补课了哦~_~
      1)select
    SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
    select_expression,...
    [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
    [FROM table_references
        [WHERE where_definition]
        [GROUP BY col_name,...]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] ;   ]
常用的正是那么些,select_expression指想要搜索的列,前面大家能够用where来限制规范,大家也得以用into outfile将select结果输出到文件中。当然我们也能够用select直接出口
例如

SELECT * FROM users WHERE username LIKE ‘

版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:by使得查询效率提高500倍www.weide1946.com,php注入祥