首页 > 技术文章 > 二次编码注入

rane-blog 2020-03-18 17:26 原文

原理:PHP代码中使用了urldecode()等编解码函数,放在了一个尴尬的使用位置,与PHP自身编码配合失误
自己编写一个二次编码注入的代码

<?php
	error_reporting(E_ALL ^ E_DEPRECATED);
	header("Content-Type: text/html; charset=utf-8");
	$conn = mysql_connect('localhost', 'root', '123456');
	mysql_select_db("security", $conn);
	//mysql_query("SET NAMES 'gbk'", $conn);
	$id = mysql_real_escape_string($_GET['id']);
	$id = urldecode($id);
	$sql = "select * from users where id='$id'";
	$query = mysql_query($sql, $conn);
	if($query == True)
	{
		$result = mysql_fetch_array($query);
		$username = $result["username"];
		$password = $result["password"];
 
		print_r('用户名: ' . $username . '<br />');
		print_r('密 码: ' . $password . '<br />');
		print_r('<br />SQL语句:' . $sql);
	}
 
	mysql_close($conn);
?>

在这里插入图片描述
mysql_real_escape_string在urlencode之前,所以不能解决由于urlencode带来的编码问题
在这里插入图片描述
%25%23是被自身编码解决了的,编码成%和#
因为没有明显的分号’,所以mysql_real_escape_string不能操作,所以%27#在urldecode处就变成了’#,就完成了SQL注入的目的
使用union方法

推荐阅读