WEB攻防系列之SQL注入
所谓的SQL注入、XSS、溢出等的缝隙,归根结底,便是代码注入的问题,导致代码注入缝隙的发生的原因是由于代码和数据没有别离,即程序所处理的数据和程序的代码混在了一同,没有清晰的区别。。。
而SQL注入发生的主要原因也便是用户所提交的数据被当作代码来履行,请看下面这个获取文章内容比如(省掉了部分代码):$id = $_GET["ID"];$sql = ‘SELECT * FROM article WHERE ID=’.$id;$mysqli->multi_query($sql);?>留意看,当我们要检查这个某个文章的时分,就提交这个文章的ID(一般的网站关于这种恳求都是运用GET恳求的,即用户可容易在URL上修正恳求的内容。假如是POST恳求的,可通过抓包改包或是修正网页内容进行修正恳求),就会把SQL句子中的$ID变量赋值为当时用户提交的数据进行SQL查询。例如:当用户检查一篇ID为3的文章,那么此刻的URL为
http://www.xxx.com/article.php?ID=3;
此刻服务器$_GET["ID"]所得的值便是3了。在通过SQL句子拼接之后,所得的SQL句子就变为
SELECT * FROM article WHERE ID=3;
当然,这个是程序员所希望的完成的,但黑阔们看到的不是功用,而是缝隙!!
由于存在SQL注入缝隙的要害条件是SQL句子拼接了用户能操控的变量,这个条件,在以上的比如中就契合了,所以黑阔彻底能够提交歹意SQL句子与原恳求的内容拼接成一个程序员彻底没想到的歹意SQL句子提交给数据库引擎去履行。。。
假定黑阔在本来的URL后添加如下的句子:
;DROP TABLE admin–即本来的URL变为:http://www.xxx.com/article.php?ID=3;DROP TABLE admin–留意,$_GET["ID"]此事的值就不再是3了,而是3;DROP TABLE admin–了。那拼接后的SQL句子会是怎样的呢?!那便是:SELECT * FROM article WHERE ID=3;DROP TABLE admin–
好了,那我们来剖析一下这个SQL句子。。。
首要,会履行:SELECT * FROM article WHERE ID=3,这是一个正常的SQL句子吧?!,是查询文章的内容的。 问题是,履行完这个之后,会再履行:DROP TABLE admin 而这个便是一个歹意的SQL句子了,它的作用是删去admin这个表,这样就导致数据库的数据丢掉了,是一个十分风险的句子,相同的,我也能够删去article这个表,导致此网站一切的文章丢掉!!很凶恶吧?!!当然,现在用multi_query函数的也比较少了,大多数都是用mysql_query函数,但别以为这样就能够防止SQL注入,由于提交的数据仍是被拼接到了SQL句子中,只需结构好歹意的SQL句子,进行SQL注入也是垂手可得的。例如:在本来URL后参加 order by X(X是数字),就能够猜字段数,别的还能够加Union句子也能够做到句子的拼接进行进犯(需求SQL引擎版别的支撑,Access数据库不支撑),详细的一些进犯技巧,我们能够Google或百度一下,这方面的材料许多,我也没必要展开讲。。。 这也是一个典型的SQL注入的比如,可是实际中,有一大部分小白程序员都会写出这样显着的缝隙代码!!(留意这个句子后边的–,这是MYSQL句子中的注释,用于注释掉后边的内容,防止句子履行过错,由于黑阔一般状况下是不能精确的知道你的SQL句子的结构的)
可是一般的黑阔是不会做这些的,由于做这些对他们自己没有任何好处,他们大部分的意图不是删去你网站的数据,而是要拿到这个网站的shell乃至是服务器权限。所以,他们通常会使用SQL注入去结构歹意句子来获取WEB管理员的后台帐号和暗码,然后去登陆后台,进行进一步的浸透(假如数据库用户的权限足够高,黑阔能够直接获取体系权限),这儿就不扩展了,有爱好的童鞋能够Google或百度一下,这方面的材料也是许多的,我们论坛也有不少。。。
再来看一个很经典的SQL注入比如,那便是全能暗码。或许有些人会觉得,全能暗码的问题怎样和SQL注入扯一同了呢?!事实上,呈现全能暗码这种缝隙,实质便是SQL注入,这在 代码注入(番外篇)上现已总结过了,我就不再总结了,直接仿制过来吧。。。
看发生全能暗码的缝隙代码:
$username = $_POST["username"];$password = $_POST["password"];$result = mysql_query(“SELECT * FROM Users where UserName=’$username’ and PassWord=’$password’”);if(mysql_num_rows( $result ) > 0){echo ‘alert(“login is true!”);window.location = “index.php”’;}
当黑阔提交 ‘or 1=1– (全能暗码)的时分,提交的内容被注入到SQL句子中,这时分有几种状况,这儿罗列两个:
1. 当黑阔猜想用户名为admin,暗码提交全能暗码的时分,SQL句子变为:
SELECT * FROM Users where UserName=’admin’ and PassWord=”or 1=1–’
[1] [2] [3] 黑客接单网