今天的靶机是一个主要面向web应用程序的框架。更具体地说,我们将了解如何对启用了SQL数据库的web应用程序执行SQL注入。我们的目标是具有针对后端数据库的搜索功能的网站,该数据库包含易受此攻击的可搜索项目攻击类型。任何用户都不应该看到此数据库中的所有项目,因此网站将为我们提供不同的搜索结果。

SQL 服务通常如何运行的一个很好的例子是用于任何用户的登录过程。每次用户要登录时,Web 应用程序都会将登录页输入(用户名/密码组合)发送到 SQL 服务,并将其与该特定用户的存储数据库条目进行比较。假设指定的用户名和密码与数据库中的任何条目匹配。在这种情况下,SQL 服务会将其报告返回 Web 应用程序,而 Web 应用程序又会让用户登录,从而允许他们访问网站的受限部分。登录后,Web应用程序将以cookie或身份验证令牌的形式为用户设置特殊权限,该权限将其在线状态与他在网站上的身份验证状态相关联。此 Cookie 存储在本地、用户的浏览器存储和网络服务器上。

之后,如果用户想要在页面上列出的列表项中搜索特定内容,他将在搜索栏中输入对象的名称,这将触发相同的 SQL 服务代表用户运行 SQL 查询。假设数据库中存在搜索项的条目,通常位于不同的表下。在这种情况下,将检索相关信息并将其发送到 Web 应用程序,以作为图像、文本、链接和其他类型的(如注释和评论)呈现给用户。

网站使用MySQL,MariaDB或其他类型的数据库的原因是它们收集或提供的数据需要存储在某个地方。数据可以是用户名、密码、帖子、消息或更敏感的集合。

SQL 注入是利用使用该检索和存储的网页的常用方法。

用户输入数据。如果配置不正确,可以使用此攻击来利用众所周知的漏洞,这是非常危险的。有许多不同的技术可以防止 SQL 注入,其中一些是输入验证、参数化查询、存储过程以及在服务器网络外围实现 WAF(Web 应用程序防火墙)。然而根据OWASP的10大Web漏洞列表,可以找到这些修复程序都没有到位的实例,这就是这种类型的攻击很普遍的原因。

举例

首先,我们执行 nmap 扫描以查找开放和可用的端口及其服务。如果在命令语法中未指定备用标志,nmap 将扫描最常见的 1000 个 TCP 端口以查找活动服务。就我们而言,这将适合我们。

-sC:使用默认脚本集执行脚本扫描。它相当于——脚本 = 默认。此类别中的某些脚本被视为侵入性脚本,不应在未经许可的情况下针对目标网络运行。

-sV:启用版本检测,这将检测哪些版本正在哪些端口上运行。

是因为脚本扫描(-sC)和版本检测(-sV)被认为是扫描目标的侵入性更强的方法。这会导致被目标网络上的外围安全设备捕获的可能性更高。

nmap -sC -sV 10.129.194.173

我们检测到的唯一开放端口是端口80 TCP,它运行apache,服务器版本2.4.38 。

Apache HTTP服务器是一个免费的开源应用程序,可以在物理或虚拟Web服务器上运行网页。它是最受欢迎的HTTP服务器之一,它通常在标准HTTP端口(如端口80 TCP,443 TCP)上运行,或者在HTTP端口(如8080 TCP或8000 TCP)上运行。HTTP代表超文本传输协议,它是用于传输超媒体文档(如HTML(超文本标记语言))的应用层协议。

nmap扫描为我们提供了Apache httpd服务的确切版本,即2.4.38。通常,一个好主意是在线搜索流行漏洞数据库上的服务版本,以查看指定版本是否存在任何漏洞。但是,在我们的例子中,此版本不包含任何我们可能利用的已知漏洞。

为了进一步枚举在端口 80 上运行的服务,我们可以从浏览器直接导航到 目标的 IP 地址。

从下面开始,我们将探索暴力破解不同目录的概念,以包含在枚举阶段,这不会帮助我们利用目标,并且被认为是一个可选但值得了解的步骤。此部分被视为第 0 层的可选部分,但表示评估中有价值的步骤过程。如果我们想跳过它,可以向下滚动到SQL注入部分。

通过在浏览器的URL字段中输入目标的IP地址,我们面对的是一个包含登录表单的网站。登录表单用于对用户进行身份验证,并根据与输入用户名关联的权限级别,授予他们访问网站的受限部分的权限。由于我们不知道可用于登录的任何特定凭据,因此我们将检查枚举过程中是否有任何其他目录或页面对我们有用。在针对我们所知道的特定漏洞(例如本例中的 SQL 注入漏洞)之前,始终认为完全枚举目标被认为是一种很好的做法。

将 Web 目录视为“Web 文件夹”,其中存储和组织了其他资源和相关文件,例如其他页面、登录表单、管理登录表单、图像和配置文件存储(如 CSS、JavaScript、PHP 等)。其中一些资源直接从登入网站获取。我们都习惯的页面,例如首页 ,关于我们 ,联系我们 ,注册和页面,图像、家被视为单独的 Web 目录。导航到这些页面时,浏览器窗口顶部的 URL 地址将根据我们当前的位置而变化。例如,如果我们从联系页面到网站的页面,URL将更改如下:

https://www.example.com/home主页:
https://www.example.com/contact联系页面:

某些页面可能位于其他页面中,这意味着可以在登录页面找到忘记密码页面。

https://www.example.com/login登录页面:

因为如果我们从登录表单重定向到忘记密码页面

https://www.example.com/login/forgot忘记密码页面:

但是,假设没有提供指向所需目录的按钮和链接。在这种情况下,由于我们正在寻找的目录要么包含敏感材料,要么只是网站加载图像和视频的资源,因此我们可以在同一浏览器URL字段中提供这些目录或网页的名称,以查看它是否会加载任何内容。我们的浏览器本身不会仅仅因为网页上没有链接或按钮而阻止对这些目录的访问。网站管理员需要确保包含敏感信息的目录得到适当保护,以便用户不能只是简单地手动导航到它们。

在 Web 目录中导航时,HTTP 客户端(即我们的浏览器)使用 HTTP 协议与 HTTP 服务器(在本例中为 Apache 2.4.38)进行通信,方法是发送 HTTP 请求(GET 或 POST 消息),然后服务器将处理该请求并返回 HTTP 响应。

HTTP 响应包含状态代码,这些代码详细说明了客户端请求与服务器处理请求之间的交互状态。HTTP 协议的一些更常见的状态代码是:

HTTP1/1 200 OK : 页面/资源存在,继续向我们发送数据。HTTP1/1 404 未找到:页面/资源不存在。HTTP1/1 302 找到 : 找到页面/资源,但通过重定向到另一个目录 (已移动暂时)。这是对用户代理(Web 浏览器)的邀请,以向位置字段中指定的新 URL 发出第二个相同的请求。我们将认为整个过程是无缝重定向到指定资源的新 URL。

让我们看一下搜索和访问隐藏目录的完整过程。通过在浏览器 URL 字段中指定运行 HTTP 服务器的目标 IP 地址,后跟正斜杠 ( / ) 和我们正在寻找的目录或文件的名称,将发生以下事件:

用户代理(浏览器/HTTP 客户端)将使用我们请求的资源的 URL 向 HTTP 服务器发送 GET 请求

HTTP 服务器将在指定位置(给定 URL)中查找资源

如果资源或目录存在,我们将收到包含我们数据的HTTP服务器响应

请求(无论是网页,图像,音频文件,脚本等),当返回响应代码200 OK ,表示找到资源并且请求已成功满足。

如果在指定的地址找不到资源或目录,并且服务器管理员没有为其实施重定向,则 HTTP Server 响应将包含典型的404网页,并且附上响应代码400,未找到。

上述两种情况是我们在尝试枚举隐藏目录或资源时将关注的。但是,我们将使用一种工具,该工具将为我们自动搜索,而不是手动浏览URL搜索栏以查找此隐藏数据。这就是gobuster,dirbuster,dirb等工具发挥作用的地方。

这些被称为暴力破解工具。暴力破解是一种提交通过称为wordlist的特制变量列表提供的数据的方法,以试图猜测正确的输入以进行验证并获得访问权限。使用这样的工具将暴力破解方法应用于Web目录和资源,将逐个将单词列表中的变量逐个注入HTTP服务器的无关紧要的请求,然后读取每个请求的HTTP响应代码,以查看它是否被接受为现有资源。在我们的例子中,我们将使用的wordlist将包含标准目录和文件名(例如图像 ,脚本 ,login.php , admin.php ),以及更不常见的目录和文件名。

相同的攻击类型也适用于密码暴力破解 - 从wordlist提交密码,直到我们为指定的用户名找到正确的密码。这种方法因其复杂性低而普遍适用于低技能的攻击者,其缺点是“嘈杂”,这意味着它涉及每秒发送大量请求,以至于它很容易被外围安全设备检测到,微调以侦听与登录表单的非人类交互。

对于我们的靶机,我们将运行一个名为 Gobuster ,该工具将暴力破解我们选择的wordlist中提供的目录和文件。

使用gobuster

但是,我们仍然缺少单词表。有一个专用文件夹,其中包含无数的单词列表,字典和弱口令表,这些表格预装在kali中,位于路径 / usr /share /wordlists 。但是,我们也可以下载SecLists集合,它是当今使用的最有名的单词列表集合之一。可以通过以下方式下载安全列表

git clone https://github.com/danielmiessler/SecLists.git

现在,我们可以开始正确使用 Gobuster 的全部功能。

cd usr/share/wordlists/dirbuster/
gobuster dir --url http://10.129.195.99/ --wordlist directory-list-2.3-small.txt

dir :指定我们希望进行 Web 目录枚举。--url :指定运行 HTTP 服务器的目标计算机的网址。--wordlist :指定要使用的单词列表。

查看网络目录后,我们没有发现任何有用的信息。我们的输出中显示的结果表示大多数网站的默认目录,并且大多数情况下,它们不包含可能以任何方式被攻击者利用或有用的文件。但是,仍然值得检查它们,因为有时它们可能包含错误地放置在那里的非标准文件。

实战

由于Gobuster没有发现任何有用的东西,我们需要检查是否有任何默认凭据或以某种方式绕过登录页面。为了检查默认凭据,我们可以在用户名和密码字段中键入最常见的组合,例如:

admin:admin
guest:guest
user:user
root:root
administrator:password

尝试所有这些组合后,我们仍然无法登录。假设我们可以使用一种工具来尝试暴力破解登录页面。但是,这将花费很多时间,并可能触发安全措施。

下一个明智的策略是测试登录表单中是否存在可能的 SQL 注入漏洞。

以下是使用 PHP 和 SQL 进行身份验证的工作原理示例:

<?php
mysql_connect("localhost", "db_username", "db_password"); # Connection to the SQL
Database.
mysql_select_db("users"); # Database table where user information is stored.
$username=$_POST['username']; # User-specified username.
$password=$_POST['password']; #User-specified password.
$sql="SELECT * FROM users WHERE username='$username' AND password='$password'";
# Query for user/pass retrieval from the DB.
$result=mysql_query($sql);
# Performs query stored in $sql and stores it in $result.
$count=mysql_num_rows($result);
# Sets the $count variable to the number of rows stored in $result.
if ($count==1){# Checks if there's at least 1 result, and if yes:$_SESSION['username'] = $username; # Creates a session with the specified $username.$_SESSION['password'] = $password; # Creates a session with the specified $password.header("location:home.php"); # Redirect to homepage.
}
else { # If there's no singular result of a user/pass combination:header("location:login.php");# No redirection, as the login failed in the case the $count variable is not equal to
1, HTTP Response code 200 OK.
}
?>

请注意,在#符号之后,所有内容都变成了注释?这就是PHP语言的工作原理。请记住这一点,以备后用。

上面的此代码容易受到 SQL 注入攻击,我们可以在其中修改查询($sql variable),通过网页上的登录表单,使查询执行不应该执行的操作 - 完全绕过登录!

请注意,我们可以通过网页上的登录表单指定用户名和密码。但是,它将直接嵌入到执行 SQL 查询而不进行输入验证的 $sql 变量中。请注意,没有任何正则表达式或函数禁止我们插入特殊字符,例如单引号或 # 标签。这是一种危险的做法,因为这些特殊字符可用于修改查询。单引号对用于指定需要从 SQL 数据库中检索的确切数据,而 # 标签符号用于进行注释。因此,我们可以通过输入以下内容来操作查询命令:

admin'#
1

我们将使用该单引号关闭查询,允许脚本搜索用户名。添加 # 标签后,我们将注释掉查询的其余部分,这将使搜索指定用户名的匹配密码时过时。如果我们进一步查看上面的PHP代码,我们将看到代码只有在我们的用户名和密码组合恰好有一个结果时才会批准登录。但是,由于我们跳过了查询的密码搜索部分,因此脚本现在将仅在存在用户名 admin 的任何条目时进行搜索。在这种情况下,我们很幸运。确实有一个名为 admin 的帐户,它将验证我们的 SQL 注入并返回$count variable的值,这将通过if语句 ,允许我们在不知道密码的情况下登录。如果没有admin帐户,我们可以尝试任何其他帐户,直到找到一个存在的帐户。( administrator ,root 、john_doe 等)任何有效的现有用户名都将使我们的SQL注入工作。

在这种情况下,由于查询的密码搜索部分已被跳过,因此我们可以在密码字段中抛出任何我们想要的东西,这无关紧要。

password:abc123

让我们看一下PHP代码的查询部分如何受到我们的输入的影响。

SELECT * FROM users WHERE username='admin'#' AND password='1'

请注意,根据我们的输入,我们已经注释掉了查询的密码检查部分?这将username = “admin”结果在 PHP 脚本中返回值 1,而不检查密码字段以匹配该条目。这是由于上面显示的PHP代码中缺少输入验证。

按下登录按钮后,将发送漏洞利用代码

Your flag is: e3d0796d002a446c0e622226f42e9672

SQL注入与万能密码登录相关推荐

  1. mysql登录框万能密码_Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]...

    在这一关卡我学到了 1.万能密码的构造,大概的去揣测正常的SQL语句是如何的. 2. 3. 00x1SQL万能密码的构造 在登录框当中可以添加了一个单引号.报错信息如下所示: 据此报错,我们大概的可以 ...

  2. php密码注入,php防止sql注入之万能密码以及防范

    说什么叫sql注入呢? 就是在登录.注册.input中输入一些影响sql语句的代码 导致你的sql语句出现问题,比如说这个问题: select * from web_manage where user ...

  3. sql注入之万能密码总结

    万能密码 万能密码原理 原验证登陆语句: SELECT * FROM admin WHERE Username= '".$username."' AND Password= '&q ...

  4. web4.0之万能密码登录

    一. 页面观察 看到一个登陆框,看到登录框我们就要想到是否存在sql注入,逻辑漏洞(前端认证绕过).我们先看下是否存在sql注入 2. 注入判断 随便输入数据,我们用burp截取数据包 我们输入单引号 ...

  5. web安全—万能密码登录(跳过密码验证)

    什么是万能密码登录呢,我们可以理解为绕过密码验证.通过构造语句来直接绕过登录的验证. 这里我们举dvwa的靶场为例子 我们打开靶场,看到一个登录页面,上面显示让我们输入用户密码,由于我们不知道他的账号 ...

  6. 汉王人脸考勤管理系统 万能密码登录 漏洞复现

    fofa:title=="汉王人脸考勤管理系统" 漏洞复现 登录页面: 使用万能密码登录 用户名:or' or 1=1– 密码:or

  7. SQL手工注入原理万能密码及默认密码登陆后台

    SQL手工注入原理: 下面就是比较笨的方法了==    一个一个试 (* ̄rǒ ̄) 针对于.asp后缀网 + ?id_  在后面加入下面代码,返回正确那就是无注入点,反正就是有注入点 一.什么是SQL ...

  8. Ajax post sql注入,cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)

    摘要 cmseasy前台无需登录直接获取敏感数据的SQL注入cmseasy 前台无� cmseasy前台无需登录直接获取敏感数据的SQL注入cmseasy 前台无视gpc的sql注入 我下载的是最新版 ...

  9. python sql注入漏洞 ctf_CTF-WEB 一个登录框SQL盲注

    一些师兄给了个平台,最近学了很多SQL注入和编写脚本的知识,跃跃欲试,结果这一做就是漫漫长路,还是很多东西不熟悉啊. 首先找注入点: 发现用户名错误和密码错误会分开提示,可以用布尔盲注,(*^▽^*) ...

最新文章

  1. 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
  2. 非常量引用的初始值必须是左值_C++核心编程--引用
  3. 如何判断浏览器的请求头是不是结束
  4. Java Annotation的RetentionPolicy介绍
  5. Python最佳代码实践:性能、内存和可用性!
  6. 在Kotlin中使用libGDX
  7. 直播丨国产数据库的机遇与挑战
  8. java spring文件下载_SpringMVC实现文件上传和下载的工具类
  9. Linux学习总结(77)—— Shell 开发运维经验总结
  10. Android笔记(十)ListView
  11. 好搜独立,三分天下成历史
  12. 线程动画屏保小球碰撞c语言,线程小动画之屏保--模仿小球碰撞反弹(一)
  13. 天线效应的原理及消除【转帖】
  14. 感谢牛健老师为《Spring Boot实战派》开源Fadmin
  15. 什么是路由器 它的工作原理是什么
  16. 【游戏开发创新】手把手教你使用Unity制作一个高仿酷狗音乐播放器,滨崎步,旋律起,爷青回(声音可视化 | 频谱 | Audio)
  17. 【unity】维护一个changelog
  18. Android Jetpack 学习之Navigation、BottomNavigationView
  19. VScode跑街商场网页排版
  20. VBO转HDMI OUT 支持常用分辨率,最大支持4K60HZ

热门文章

  1. 什么是通货膨胀(Inflation)
  2. Python应用开发
  3. spacedesk投影,将电脑屏幕投影或者扩展到手机
  4. docker学习——tmpfs mounts
  5. 【安卓笔记】如何设置模拟器的IP
  6. activiti学习(二)——activiti流程的部署
  7. 无公网IP如何访问家中的NAS
  8. Ajax参数对照及Success内容
  9. 天津师范大学计算机专业排名,天津最好的10所大学公布:天津师范大学第三,各校就业率相差较大...
  10. 21 天零基础入门机器学习 , 高薪 Offer 就在眼前