sqli-labs学习教程(一)

来源:互联网 发布:qq飞车噬魂剃刀数据 编辑:程序博客网 时间:2024/05/22 02:23

本文转载自通过sqli-labs学习sql注入——基础挑战之less1-10
简介
脚本小子们一定已经动手体验了类似SQL注入等这样的操作,虽然他们可能已经通过使用自动化工具例如sqlmap来实施攻击,但却还不知它真正的原理。通过一些例如webgoat、DVWA等模拟的学习环境,我们能对SQL注入是怎样工作的,攻击是怎样发生的以及什么是SQL漏洞有一个深入的理解。这里将要使用是sqli labs,它可以从https://github.com/Audi-1/sqli-labs下载,以便我们研究学习以及编写安全的程序。
安装
1.从https://github.com/Audi-1/sqli-labs下载源代码。
2.将源代码复制到Apache webroot文件夹(htddocs,/var/www)。
3.打开sql-connections文件夹下的“db-creds.inc”文件。
4.修改mysql用户名和密码为你自己的。
5.打开浏览器,通过localhost的index.html访问文件夹。
6.点击setup/resetDB链接在你的mysql中创造数据库。


实验
第一节:GET – Error based – Single quotes – String

第一节讲得详细一点,后面的有新知识才会说。我们使用的工具是火狐浏览器+hackbar插件。
为了方便学习查看,可以在源码中的$sql下一句语句写以下PHP语句(就是输出拿到数据库查询的完整语句是怎么样的)。

echo "your sql statement is ".$sql."<br>"; 

先在后面先加?id=1。


在1后面再加一个引号,发现报了sql语句的语法错误,那么应该存在sql注入。


接下来猜字段。


可以看到没有第4列,所以只有3个字段。下面直接用union语句查询,先看看1,2,3。


看一下源码,mysql_fetch_array只被调用了一次,而mysql_fetch_array从结果集中取得一行作为关联数组或数字数组或二者兼有,具体看第二个参数是什么。所以这里无论怎么折腾最后只会出来第一行的查询结果。


只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。


下面就开始真正查询数据库的各种信息了。可以看到只有第2列和第3列的结果显示在网页上,所以就只能用2,3这个位置了。但是两个位置应该是不够用的,这时就需要用到数据库的连接函数了,常用的是concat和concat_ws,其中concat_ws的第一个参数是连接字符串的分隔符。
user():返回当前数据库连接使用的用户
database():返回当前数据库连接使用的数据库
version():返回当前数据库的版本


接下来查询security数据库中有哪些表。首先说一下mysql的数据库information_schema。它是系统数据库,记录是当前数据库的数据库,表,列,用户权限等信息,下面说一下常用的几个表。
SCHEMATA:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等。
TABLES:储存mysql中的表信息,包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。
COLUMNS:储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等。
通过直接在mysql控制台实验可以看到,查询information_schema中的信息时,使用where语句值不能直接用英文,要用单引号包裹着,当然用十六进制表示也可以。



只能返回一个table,这时就要用的limit了。第一个参数是结果集中的第几个,跟C语言的数组的索引一致,第二个参数就是个数。如 limit 1,2返回第二行和第三行,因为1表示是第二行,2表示行数是2。




因为一般我们只关心用户的账号密码,所以接下来列举users的列名。




最后枚举用户名和密码。


第一课的内容就到这里。

0 0
原创粉丝点击