我试图向我的客户证明该系统对mysql注入不安全。我希望有一些证据可以向我显示用户的完整列表(从*中选择)或在系统中注入新的用户/管理员,以便我可以在之后登录。
这是我构建系统的简化方法:
PHP登录网站:
$user = $_POST["user"];
$pwd = $_POST["pwd"];
$query1 = "INSERT INTO user_log (username, password,ip) VALUES ('$user','$pwd','127.1.1.1')";
$result1 = mysql_query($query1) or die("Query failed: " . mysql_error());
$query2 = "select * from login where name = '$user' and pass = '$pwd' limit 1";
$result2 = mysql_query($query2) or die("Query failed: " . mysql_error());
mysql表是这样的:
CREATE TABLE `user_log` (
`idadmin` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(45) DEFAULT NULL,
`password` varchar(45) DEFAULT NULL,
`ip` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idadmin`)
)
CREATE TABLE `login` (
`idlogin` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`pass` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idlogin`)
)
即使我看到它完全不安全,我发现很难注入它。
在这种特定背景下进行注射的任何想法或其他技术?
答案 0 :(得分:4)
您无需证明您可以查看所有用户记录以证明系统不安全。
如果代码在magic_quotes_gpc
下运行,它应该是相当安全的,尽管magic_quotes_gpc
引入了各种其他问题。
如果您未在 magic_quotes_gpc
下运行,则无论提供什么密码,您都应该能够使用用户名' or true; --
登录。
答案 1 :(得分:1)
忘记SQL注入。该系统可以被认为是非安全的,仅基于它将非散列/非盐渍密码存储在登录表和日志表中。
如果有人入侵您的数据库,或发现转储部分或全部数据所需的适当SQL注入,黑客就可以访问任何用户试图用来登录网站的所有密码。
想想安全隐患。如果您随机浏览到此网站,忘记了您使用的密码,然后尝试所有常见的密码变体,此数据库将保留其中的最后一个。
寒战。我觉得这样的代码在那里就让我感到寒意。
答案 2 :(得分:0)
如果客户使用的是旧版本的PHP,低于5.4.0版本,并且启用了mysql_quotes_gpc,那么这是安全的。
如果你可以通过用户输入运行任何类型的SQL,那就是 INSECURE 而且丑陋!这不是一个问题,你是否可以找出有效的攻击类型,黑客可以通过许多创造性的方式获得他们想要的东西。
可以在插入查询上运行Time based SQL injection,如果选择查询是否通过则无关紧要。
如果mysql用户具有权限,SQL注入可以允许攻击者创建文件。 SELECT load_file('/ etc / passwd')INTO OUTFILE'/some/path/to/web/root/here.php'