基于dvwa环境下级别为low的SQL手工注入教程:
首先是进入已搭建好的dvwa环境中去(一定要搭建好dvwa环境才能进行下面的操作),这可能会是一些初学者所面临的的第一个问题,比如我,曾为了寻找这个入口,浪费了不少的时间,所以在这里就提一下,最好是能够记住,忘了的话可以随时过来看一下:http://127.0.0.1/DVWA/setup.php。
按照提示点击最下面的按钮创建数据库,创建成功就会直接进入登录页面进行登录,然后就可以直接访问http://127.0.0.1/DVWA/login.php得到如下登录页面:
初始状态下username和password分别为admin和password
接下来我们login,成功登录
可以看到我们已经成功登录,其中红色箭头所指就是我们SQL注入的地方了,而下面蓝色箭头指向的DVWA Security是设置难度等级的地方,初始状态下,难度一般为impossible,对我们初学者而言,并不适合,我们需要设置为low,再打开红色箭头所指的地方,SQL Injection,得到如下图所示的界面:
这便是一个表单,是用户交互式的地方,也是常见SQL注入漏洞存在的地方。
第1步:我们测试是否存在注入点,先输入“1”(双引号括起来的内容即为要输入的,下同),返回结果:
接下来,输入特殊字符“1‘”(1和英文单引号),得到如下结果:
”You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1‘‘‘ at line 1“翻译为中文便是”SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获得在第1行“1”附近使用的正确语法“看到这个结果,我们几乎可以确定这个表单存在SQL注入漏洞。
第2步:测试信息的列数 使用 order by+数字的形式。例如我们可以输入"1‘ order by * -- "(*代表具体的数字),要注意的是--后面有空格)随着*数字从1逐渐变大,当*为3时,终于浏览器不再返回正常值,得到了“Unknown column ‘3‘ in ‘order clause‘”表明这里有两个表。这是为什么呢?order by
在SQL语句中是排序的意思,如果这里只有两个表(那么我们使用联合查询union select时一次可以查询两个数据),输入排序三个的指令肯定会犯错,便是这个原因。
接下来我们用联合查询,union select,尝试输入“1‘ and 1=1 union select 1,2 -- ”得到如下结果:
从而,我们可以得出First name处显示结果为查询结果第一列的值,surname处显示结果为查询结果第二列的值。(简单点说,就是First name一行显示第一个命令的值,Surname一行显示第二个命令的值,便是一次联合查询可以得到的两个数据)
接下来呢?好像离我们的目标还很遥远(突然想插一句,我们的目标是什么?当然是拿到所有的用户名和密码呀)
第3步:获取当前数据库和当前用户名。介绍几个内置函数user()、database()、version(),@@version_compile_os,user()将会返回进行当前查询的用户名,database()将会返回当前网站所使用的数据库名字,version() 获取当前数据库版本,@@version_compile_os获取当前操作系统.。通过输入“1‘ union select database(),user() -- ”我们得到如下页面,可以看到,绿色箭头一前一后分别代表当前数据库名字和当前进行查询的用户名。蓝色箭头便是两条命令得到的数据。即当前数据库为dvwa,当前用户名为“[email protected]”。可以用上文提到的类似的指令获取当前数据库版本和当前的操作系统信息。
通过以上查询我们知道当前数据库名为dvwa,然而好像……并没有什么卵用……不要慌,问题不大,我们继续。
第4步:测试连接数据库权限。可以输入“1‘ and ord(mid(user(),1,1))=114 -- ”
如图所示,返回正常,表明为root(即最高权限,你可以得到你想要的)。
第5步:获取当前用户的表(看不懂没关系,问题不大,往下看就好了)事实上,我们目前的有效信息只有当前的数据库为dvwa,其实MySQL中存在一个百科全书似的数据库叫 information_schema我么可以利用它查到dvwa数据库目录下的表,那么构造查询语句“1‘ union select table_name,2 from information_schema.tables where table_schema= ‘dvwa‘ -- ”(这里用到了SQL查询的语法以后我会陆续介绍,“SELECT 字段名 FROM 数据表名称 WHERE 搜索子句”)其中在information_schema(就是那个几乎包含所有的那个库)里,有一个表为tables,table_name是表名,table_schema表示的是某个表所在的数据库,所以看懂了吧,联合搜索union select后面的table name便是我们的目的——获取表的名称,from后面便是information_schema这个“库”,where相当于添加了一个条件,就是说在dvwa这个表所在的数据库中…………有没有很乱?我也觉得很乱,笔者也没有接触过什么理论,所以逻辑有点混乱,但大可不必担心,笔者也是看着前辈们的教程,在实践中积累经验,我相信你看了演示,也一定能明白。
好了,可以看到,我们弄出来了两个表,guestbook和users,不假思索,肯定要搞users了!于是输入命令“1‘ union select column_name,2 from information_schema.columns where table_schema= ‘dvwa‘ and table_name= ‘users‘ -- ”(注意看命令,感受它的格式,体会它的含义,这点很重要!)
看!password!终于等到你,还好我没放弃,接下来问题变得简单,“1‘ union select user,password from users -- ”可以试着理解它的意思,搜索用户(user)、密码(password)在users这个表中。
便得到了我们想要的,但是乍一看,这………………这怪模怪样的东西是密码?
对,这就是加密过的MD5密码,想要破解也很容易,直接百度搜索md5密码在线破解就OK了,笔者用的是这个站点https://www.cmd5.com/
怎么来验证一下呢?
来到这里,“暴力破解”的地方,拿着我们注入得到的用户名和密码感受一下成功的喜悦吧。
PS:需要说明的是,本文只是很浅的一部分,事实上,SQL手工注入的其他命令还很多(会有后续文章渐渐补充),也可以用工具注入(以后笔者也会慢慢更新)笔者也是初学者,花费了很长时间才体会到一点点,走了很多很多弯路,在工具注入成功的一刹那,也曾激动地落泪,因为每个人所付出的,只有自己明白吧。写给那些像我一样迷茫的人,再坚持一下,绝对会成功的。欢迎大牛批评斧正,笔者水平有限,还有不懂得小伙伴可以发私信给我。
原文地址:https://www.cnblogs.com/x-anonymous/p/9900024.html