记一次入门难度的SQL注入与密码破解

1,166 阅读12分钟

我来了哈哈哈哈哈哈哈

虽然按照之前说的,复活节刚放假的时候就应该更新了,不过随着直飞回国的机票取消,并且我妹表示还是想尽快回国之后,我开始跳入了疯狂研究转机的大坑

随后就是重新预定核酸,重新去联系南航在英国的办事处买联程机票,还要看芬兰的入境与转机要求

对于我这种小红书上无论写的多详细都要查政府入境要求才放心偏偏英语还不好的人来说研究转机是真的要命......

image.png

不过这一周多倒是屯了挺多密码学的笔记,回头会整理成文章放上来,感觉各种加密方式与优缺点的分析看着还是很有意思的

今天先放一个刚刚做完的靶机渗透测试,难度比较低,但是涉及了两个比较经典的工具包,同时体现出了网站前端与后台数据库的联系,是入门但完整的一次测试

首先是测试环境与目标

本次测试使用的是学校日常教学使用的Ubuntu-32bit虚机

已知,学校基于一个服务器搭建了网站,URL为http://10.0.2.x/index.html

文章目标

向萌新展示一个简单的网站攻击过程

如果有皇霍的学弟学妹刷到这篇文章记得收藏,回头IY2840用得上的哈哈哈哈哈哈

文章主要还是对自己的实践操作进行总结,写的可能比较简陋,错误之处欢迎大佬指正

先解决第一步

首先难住我们的就是,对于一个我们需要测试的网站而言,连完整的域名我们都还没有掌握,所以对于我们来说,最重要的首先就是把域名缺失的问题搞定

我们可以看到,域名中比较存疑的部分是10.0.2.x,很显然这整体来说是一个IP地址

这时我们开始分析问题,找到缺失部分的地址看起来是一件很无从下手的事情,但转换一下思路,我们不妨把问题看做,在可能的范围内,有哪些地址对应了可访问的服务器

想解决这个问题,我们需要用到nmap工具

NMAP(Network Mapper)是一款开放源代码的网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个主机也没有问题

首先安装工具,在linux中,我们打开终端,使用root权限进行安装

输入命令 sudo apt install nmap

其中sudo是标明以root权限执行此命令,如果你当前使用的是普通用户账号,在这一步时还会需要输入root账户的密码

随后,我们使用nmap的sn指令,该指令可以用于探测扫描主机

我们现在不确定的是最后一位,但是根据网络的基本知识,我们可以知道它的取值在1-255,所以这一步,我们使用的指令就是

nmap -sn 10.0.2.1-255

image.png

随后,我们会发现命令行上返回了若干地址,当然在我扫描的时候也就发现了三个,其他两个打开了以后显示的都是一些主机基本信息

image.png

但是唯独10.0.2.4这个地址,输入进去发现是一个大大的登录界面

image.png

嗯,很完美

绕过登陆界面并找到注入点

SQL注入绕过登陆,是一种比较被大家熟知的安全问题,首先来给萌新普及一下原理

比如,一个普通的登陆功能的语句,大概是这个样子

select*from user_table where username = '' and password = ''

select 这部分是数据库的语句,这个语句被用于,确认你的输入能否在user_table(即存储用户的数据库)中匹配到一个username属性与password属性能符合你的输入的元组,我们的输入会被传输到username与password后面的单引号中

但是,说到底,这种归还是一句编程语句,它不能跳开语法的限制

如果我们输入用户名admin密码123,他会变成

select*from user_table where username = 'admin' and password = '1234'

但如果我们输入一些比较反常识的东西呢?比如仅在username那一栏输入

’ or 1 = 1 --

那么这个语句是不是就变成了

select*from user_table where username = '' or 1 = 1 --' and password = ''

即,username等于空(null)或1=1(为true)

一旦出现这样的输入,则基于 anything OR true等效于true的原理,系统会判断你输入了正确的用户名

而后面的密码部分,则已经被你用“--”给注释掉了

那么我们就登陆进了这个系统

这就是所谓的sql注入,为判断某个链接是否存在注入,我们可以通过对其传入可控的参数对代码进行简单构造,通过服务端返回的内容来判断有无注入

在真正的注入时,我使用到的三个语句分别为

admin' or '1' = '1

' or 1 = 1#

admin';#

并不是所有的语句都能对固定的网站完成注入,这取决于该网站的设置,所以,我们可以在平时收集尽可能多的语句

image.png

这就是通过第二行语句登陆进去后的样子

有趣的是,当我们使用第一行与三行语句登陆时,我们看到了这样的界面

image.png

第一行第三行,与第二行很显著的一个差别在于,第二行只会让系统在username检查时,判定输入为true,而一三行则实打实的,往username处丢入了一个字符串admin,这个admin随后在传输时,则被系统认定为一个用户名

而当我们丢入admin后,系统展示出了与username仅为true时的区别,它并没有报错,而是显示了更多的信息

这向我们传递出了一个极有价值的信息:这个系统中有一个用户的用户名是admin,而且叫这个名字,几乎可以肯定这是这个系统的管理员账户

到这一步为止,我们已经做到了,在不被授权的情况下访问该网站的数据,但是如果有一天这个sql的逻辑漏洞被该网站的维护人员发现并修补,则除非找出别的注入方式,我们将不再能继续访问此网站

一劳永逸的解决方法是,我们直接做每一个黑客都最爱干的事:找出系统内管理员账户的密码!!!

现在就真的开始干大事了

我们刚才已经登陆进到了网站内部,在这里我们要注意的是,以第一个注入语句为例,当我们进入网站时,网站显示的URL变成了

http://10.0.2.4/unsafe_home.php?username=admin'+or+'1'+%3D+'1&password=

在这之中,admin'+or+'1'+%3D+'这一部分,原自我们的注入,所有的空格变成了加号,等号则变成了%3D,这是浏览器本身的转字符功能

把这一部分刨开的话,这个链接原本应该是

http://10.0.2.4/unsafe_home.php?username=&Password=

解析一下这个URL表达的含义

http://是网站使用的协议

10.0.2.4是地址

unsafe_home.php?username=&Password=则可以被看作

<入口文件名>.<文件扩展名>?<通讯端点1=内容1><通讯端点2=内容2>

URL的通讯指向执行通讯的endpoint,也就是通讯端点,通讯端点被用于定位,然后我们将对应内容送入后端对应的位置

现在开始,我们要用到第二个工具,sqlmap

sqlmap是一个开源的渗透测试工具,他可以自动检测和利用sql注入漏洞并接管数据库服务器

我们用跟nmap相同的方式下载他

输入的指令大家就从图里看吧,反复敲好麻烦

image.png

在这里列出的就是这个网址对应的数据库,指令中,-u被用于上传参数,参数就是要扫描的网站的URL,而--dbs表示枚举DBMS数据库

得出如下结果

image.png

这张图返回的结果告诉我们,这个网站使用的数据库管理系统是MySQL 5.0.12,并有如下若干数据库

我们一眼就看到,其中有一个数据库叫做user,立刻就把他盯上并作为下一个目标

image.png

-u功能不变,--tables用于遍历DBMS(database management system)中的database table

讲一下一个基本概念概念,database由数量大于等于一的table组成

-D 上传database名称

总的来说,就是遍历该URL网站下,名字为user的database中包含的所有tables,得到结果如下

image.png

数据库user中只包含credential这一张表

image.png

--columns,列,在table中,每一列就是一个属性

这个指令被用来,遍历数据库users的表credential中的列,得到结果如下

image.png

然后我们要有这样的一步操作

image.png

--dump, dump DBMS database table entires

将这个数据库的table中的实例(entires,单数为entiry)给下载下来

entiry,实体,是现实世界中可区别于所有其他对象的一个事物或者对象

比如,在一个存有姓名,学号,年龄,专业的表中,有一行数据

李小白,123456,20,information security

那么李小白在这个数据库中,就是一个实体

dump这个表的实体,就是把这里面的实体都给整出来

image.png

执行完这一行命令之后,系统陆续问了我们几个问题,前两个不重要重点是第三个

do you want to use common password suffixes?

我们选择yes之后他开始执行,执行大约7秒后,显示出了一个

cracked password 'assignment' for hash '.....'

随后我们crtl + C终止了执行,返回出了这样的结果

image.png

回忆一下,刚才我们在遍历columns时,就已经获得了这张表的这些属性,当我们dump这张表的时候,就已经得到了这些实体,包括他们对应各个属性的值,刚才最后一步,其实是在问我们,要不要用常规词尝试匹配这里的password

系统中的password都被加密过,我们在做的是,加密常规词,看这些词被hash加密后,可不可以匹配到系统中的hash,如果有,则代表这个常规词就是这个实体的password

然后,工具在把assignment给hash掉时,匹配到了admin的password,则我们知道,admin的password就是,assignment

事后去尝试时,在网站上使用admin+assignment,登陆成功

总结

技术流程没什么可总结,该写的都在上面,我们来谈几点安全行业的问题

首先,不要信任用户的输入,用户的输入有时候,可能会对系统造成危害,就像我们的注入语句。很多时候,我们会通过禁止输入诸如空格,分号,引号之类的字符来实施管控,但对应的也有屏蔽这些管控机制的方法,这样来回的防御与攻击就是SQL安全领域所研究的课题

其次,用户的安全意识。无论多严肃的安全系统,都无法防止用户设置简单的用户名与密码,事实上,当今很多互联网公司的管理员,习惯使用admin/administrator作为管理员账户名称,也不会使用太过复杂的密码,甚至将密码写在便签贴在桌上,这种种行为,都造成了极大的安全隐患。比起系统的安全,人心与人性,才是更大的漏洞。

最后,有时间的时候,大家可以多去了解当下流行的强大工具,阅读他们的使用说明,当你遇到问题的时候,难的不是使用某种工具解决问题,而是你并不知道有这种简便工具可以使用。对于简单问题,使用工具会比自己写代码做脚本更加便捷,对于复杂问题,参考流行工具也会使你的脚本开发更为轻松。对于这些工具的了解,就是一个从事网络安全行业的人,工作经验与个人能力的积累与沉淀。

题外话

对于最近链安的事故的感想

首先,心疼链安的老师和同学

然后,有多新的技术,就有多新的犯罪方式

最后,这些年一直都觉得,首先思考如何端正自己的内心,然后才是如何学习更强的技术

早些年在高中,有同学在U盘放了病毒软件往学校的机房装,其实他并不了解病毒乃至基本的安全技术,也并没有从他的行为得到任何好处,单纯只是享受做这件事的快感与成就感

而我的学习经历,人生第一次完成对windows的工具,用的是自家的两台电脑,各种漏洞的学习,用虚拟机复现过程,甚至真正对现实中的网站展开攻击,也是针对各种众测平台给出范围内的网站,并且测试过程中不造成破坏,测试结束后上交测试流程给相关部门,帮助维护网络环境

感谢爸妈对我的教育,让我对规则有一份无上的敬畏之心,让我在任何时候,都能忍住向他人炫技而展示技术,或者为了满足所谓的成就感而进行不授权攻击的冲动。这些年下来,我能坦坦荡荡的说自己从未干过亏心事,说自己无愧网络安全从业者的身份,我觉得这才是令我最有成就感的事

科技永远是日新月异的,不变的,应该是内心的正直感,以及维护这份正直而得到的荣耀

天地之动,驰骋不息

天地之法,执行不怠