实例 数据库 CREATE TABLE `postmessage` ( `id` int(11) NOT NULL auto_increment, `subject` varchar(60) NOT NULL default '', `name` varchar(40) NOT NULL default '', `email` varchar(25) NOT NULL default '', `question` mediumtext NOT NULL, `postdate` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT='运用者的留言' AUTO_INCREMENT=69 ; grant all privileges on ch3.* to 'sectop'@localhost identified by '123456'; //add.php 插入留言 //list.php 留言列表 //show.php 显示留言 页面 http://www.netsos.com.cn/show.php?id=71 可能存在注入点,我们来测试 http://www.netsos.com.cn/show.php?id=71 and 1=1 返回页面
图片:56_3710_51aca801b87006b.jpg
提交
图片:56_3710_0f3970ae367aeed.jpg
一次查询到记录,一次没有,我们来看看源码 //show.php 12-15行 // 执行mysql查询语句 $query = "select * from postmessage where id = ".$_GET["id"]; $result = mysql_query($query) or die("执行ySQL查询语句失败:" . mysql_error()); 参数id传递进来后,和前面的字符串结合的sql语句放入数据库执行 查询 提交 and 1=1,语句变成select * from postmessage where id = 71 and 1=1 这语句前值后值都为真,and以后也为真,返回查询到的数据 提交 and 1=2,语句变成select * from postmessage where id = 71 and 1=2 这语句前值为真,后值为假,and以后为假,查询不到任何数据 正常的SQL查询,经过我们构造的语句之后,形成了SQL注入攻击。通过这个注入点,我们还可以进一步拿到权限,比如说运用 union读取管理密码,读取数据库信息,或者用mysql的load_file,into outfile等函数进一步渗透。 防范方法 整型参数: 运用 intval函数将数据转换成整数 函数原型 int intval(mixed var, int base) var是要转换成整形的变量 base,可选,是基础数,默认是10 浮点型参数: 运用 floatval或doubleval函数分别转换单精度和双精度浮点型参数 函数原型 int floatval(mixed var) var是要转换的变量 int doubleval(mixed var) var是要转换的变量 字符型参数: 运用 addslashes函数来将单引号“'”转换成“'”,双引号“"”转换成“"”,反斜杠“”转换成“\”,NULL字符加上反斜杠“” 函数原型 string addslashes (string str) str是要检查的字符串 那么刚才出现的代码漏洞,我们可以这样修补 // 执行mysql查询语句 $query = "select * from postmessage where id = ".intval($_GET["id"]); $result = mysql_query($query) or die("执行ySQL查询语句失败:" . mysql_error());