初涉sql注入

最近,在老师的要求下注册了合天网安全实验室,并选择了基础的sql注入实验课程。花了一个上午完成了实验一,现在来整理一下我这一上午学到的知识

所谓的sql注入,就是利用程序员编写代码的漏洞,提交一段数据库查询代码,根据程序返回的结果,获得想要的数据。

实验环境的服务器配置是:apache+php+Mysql; 

想要完成实验,要先大概了解php和apache的配置,主要用到php.ini和httpd.conf

此实验主要用到的是php.ini的配置,在php.ini文件中有一个非常重要的配置选项magic_quotes_gpc=on/off。这个配置选项状态为on时,会把提交变量中所有的 ' (单引号)/,“(双引号),/(反斜杠)和 空格自动转换

为含有反斜线的转义字符。例如把 ' 转变成了 /'。就是这一点,所以完成这个实验,不能直接用普通的字符完成sql注入.(注:在新版本的php中magic_quotes_gpc的默认配置都是on)。

以下面的代码为例,看看怎么利用这段代码获取自己想要的信息:

$sql = "SELECT * FROM users where name='"";
$sql .= $_GET["name"]."'";
$result = mysql_query($sql); 

按照正常来说,网页的url是这样的:www.xxxx.com?name=要查询的姓名。

假设我们知道其中一个用户的姓名为:user1.我们要获得user1的部分信息就可以这样做:www.xxxx.com?name=user1;

那么如果我们想获得所有用户的信息呢?

我们可以这么写:www.xxxx.com?name=user1' or 1=1#

为什么要这么写,可以看看上面的获取数据库信息的语句,它最终的语句是这样的:

SELECT * FROM users where name='user1' or 1=1 # '

这个’#‘把后面的代码注释掉了,所以这样能把所有用户的信息读取出来。

这就是最简单的一个sql注入。

下面分享一些注入时常用的语句和函数:

1. version()——MySQL版本
2. user()——用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本

1. and 1=2 union select 1,2,schema_name,4 from information_schema.schemata limit N,1
2. and 1=2 union select 1,2,table_name,4 from information_schema.tables where table_schema=要查的库名的十六进制 limit N,1
3. and 1=2 union select 1,2,column_name,4 from information_schema.columns where table_name=要查的表名的十六进制 limit N,1

还有很多语句,越了解mysql就更容易获取自己想要的信息,这里就不多说了。

上面的语句多次的用到了空格,单引号,如果配置选项magic_quotes_gpc=on,只需要把这些符号替换为相应的URL编码就行了。

例如:’ 替换为 %27

给大家百度百科地址,这有一个编码表可以对照:https://baike.baidu.com/item/URL%E7%BC%96%E7%A0%81/3703727?fr=aladdin

本文参考的文章:http://blog.csdn.net/moonlit1228/article/details/6180033

                            https://www.2cto.com/article/201208/151503.html

猜你喜欢

转载自903180552.iteye.com/blog/2400659