攻防世界看题(?-2021.8.1)
Web新手区
- F12或者直接抓包
- dirsearch直接扫,然后访问robots.txt;
访问直接在网址后面输/,再输想访问的地方就行了。
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。
3.dirsearch直接扫,然后访问index.php.bak进行下载,记事本打开
4.抓包看到cookie里说了 cookie.php,访问,根据其中提示再抓包,flag在头里面。
5.HTML内容; 源码里有个disabled,删掉,那按钮就能按了。
6.随便输几下,得到网页提示用户名admin;用Intruder爆破密码。
7.php弱类型比较特性:
php中有两种比较符号
=== 会同时比较字符串的值和类型
== 会先将字符串换成相同类型,再作比较,属于弱类型比较
php中的弱类型比较会使'abc' == 0为真。(abc可换成任意字符)
8.HTTP通常使用的两种请求方法:
get:在URL后面输入‘?’,然后直接继续输入(URL结尾自带‘/’);对应PHP源码$_GET[‘名称’]
(URL是什么:eg http://111.200.241.244:56621)
post:勾上hackbar的postdata,直接输入;对应PHP源码$_POST[‘名称’]
9.xff_referer:
[X-Forward-For: IP地址]
eg:X-Forward-For:123.123.123.123
xff头一般在通过了HTTP代理或者负载均衡器时才会存在;合理使用它,可以伪造IP地址。
[Referer:URL]
eg:Referer:https://www.baidu.com
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
10.webshell的一道题 我用dirsearch直接扫目录找到了flag.txt过了。。
11.(webshell)
find命令: find / -name “flag.txt” 查找flag.txt所在位置
cat命令: cat /home/flag.txt 显示home目录下flag.txt文件的内容(无目录不行)
| 的作用为将前一个命令的结果传递给后一个命令作为输入;
&&的作用是前一条命令执行成功时,才执行后一条命令。
网站让你输入东西的时候(
eg:)
看下它的代码;如果是没有防备的(eg:)
可以在它里面输入它要的东西后加|或&&,再输入自己想执行的命令:127.0.0.1 | find / -name "flag.txt" );它就会输出我们需要的东西()
find / -name 后面有多重写法:本题flag.txt能搜到,*flag搜不到,flag*能搜到;还可以用 *flag* 搜。
*flag是找以flag结尾的文件(包括扩展名;也就是意味着如果这样能找到,其一定没有扩展名)
flag*是找以flag开头的文件 ;
*flag*是找名字包含flag的文件;
三种找法都包含flag自身。
ls命令:
ls 列出当期目录下的所有文件
ls ../ 列出上一目录下的所有文件
../表示往上一层目录找;有几个”../” 就上找几层;到最上层了,再加../就没用了
13.JavaScript代码审计
JavaScript的string类变量必须赋初值(空值赋’’),否则会出现undefined;字符、字符串均可直接相加,其效果是头尾相接。
\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31是一串转义字符,每个\x后面的两位 是一个十六进制数,对应ASCII表中的字符。这整体是个字符串。这玩意在多种语言(C,Python等)中均可直接输出。
JavaScript split函数:
语法:
stringObject.split(separator,howmany);
参数描述:
返回值:
一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。
注:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
JavaScript fromCharCode函数:
用处:ASCII码转字符
语法:
n=string.fromCharCode(ASCII码) //string. 不能省
Web提高区
- 页面会自动跳转到(1.php);访问初始界面,抓包,flag在包头。
- 类似新手区2
- ThinkPHP v5框架的漏洞——远程命令执行漏洞
输入
?s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=system&vars[1][]=blablabla blablalba可以是ls cat find等任意命令。
原理不会!
4.文件包含+伪协议
下述“file”实际应用中均应换为题目代码include中的变量。
PHP伪协议总结 https://www.cnblogs.com/-mo-/p/11736445.html
(伪协议好复杂,到现在没搞懂╭(╯^╰)╮:2021.7.27)
PHP input伪协议:
php://input可以将post请求中的数据作为PHP代码执行。
利用该方法,我们可以直接写入php文件,输入file=php://input,然后用burp抓包,写入php代码。
eg:
data伪协议:
其可以直接达到执行php代码的效果。
用法:
file=data://text/plain, <?php phpinfo();?>
函数show_source(‘文件名’) 要记住
php框里执行系统命令,要用<?system(‘’)?> ;
网页没东西时,抓包看看头、源码
5.扫一遍发现 index.php/ -> id=1 想到爆破;进去试一试 发现id只能是数字 直接爆破
对可能 可以爆破的地方要具有敏感性!
6.PHP代码审计初见
(1)源码里面白名单的过滤是判断第一个?之前的,所以构造白名单里的source.php加一个?就可以绕过白名单
(2)linux里面路径名基本可以是任意字符,所以source.php?/表示的是一个目录,source.php?/../就又回到了当前目录.
(3)后面再加几个../就可以路径穿越了
$_REQUEST[‘名称’] 函数:同时支持get和post两种读入方式;
三种读入 读入进来的东西都大概以字符串变量形式存在;可以赋值给变量
(eg:$wow=$_REQUEST[‘name’]);
注意中括号里的 对应 网页输入的 ?name=; 而不是一个变量。
include “filename” 函数:
文件包含;
filename默认和当前文件同一目录,若不是需加相对目录;
目录相关参加上面部分(windows不太一样)
require “filename” 函数 和include唯一的不同在于,include找不到返回警告,require找不到直接报错。
换行: \n 源码换行,页面不换; <br />页面换行,源码不换。
输出(echo):用法
echo $变量名;
echo “原样输出”;
echo “<br />”;
isset:isset() 函数用于检测变量是否已设置并且非 NULL。
is_string() — 检测变量是否是字符串。
in_array(search,array,type);搜索数组中是否存在指定的值;
search参数必需,规定了要在数组搜索的值;
array参数必需,规定了要搜索的数组;
type可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
mb_substr();获取部分字符串(支持中文)
mb_substr($str,$start,$length);表示从str字符串start位置(初始位置0)截取length长 度 的字符串。
mb_strpos();查找字符串在另一个字符串中出现的位置;支持中文;返回该位置数值。
mb_strpos($string,$needle,$offset);表示从string字符串offset位置开始查找needle字符 串
urldecode($str) :解码 URL 字符串的函数;需要作为被赋的值。
此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号 ('+')被解码成一个空格字符)。
7.SQL注入初见
可以联合查询的注入 初见
基本思路:让它报错---->找出它查了几个东西---->找到当前数据库名---->该数据库里的表名---->表里的列名---->列里的数据
(1)让它报错:一般用单引号+井号[ ‘ # ];单引号用于产生括号不匹配错误,#用于注释掉后面的东西(比如使limit失效);之后的东西均在单引号和#之间输入。
(2)找出查了几个:用order by 数字 二分法查询。 order by 当实际查询行数小于输入数字时报错,大于等于输入数字时返回正常。
(3)union select 1,2,3(数字数等于之前找到的查的个数)开始试水,找到有效的查询位置,查询database() 找到当前所在的数据库
(4)找该数据库中包含的表; 使用 group_concat(table_name) from information_schema.tables where table_schema=“数据库名”
information_schema 是系统的关键库,里面的tables表在此步发挥了重要作用,它记录了整个SQL里每个数据库里都有哪些表。
(5)找敏感表里的所有列: 使用group_concat(column_name) from information_schema.columns where table_schema=“数据库名”and table_name=”敏感列名”
information_schema 是系统的关键库,里面的columns表在此步发挥了重要作用,它记录了整个SQL里每个数据库的每个表里都有哪些列。
(6)找敏感列里的数据: 使用 列名 from 数据库名.表名
标蓝语句里的非汉字部分都是固定输入。
//from后面的写在最后!!(还是在#号前面的)
tables表 columns表
9.PHP代码审计
.phps文件首次出现
什么是 .phps 呢?
phps 文件就是 php的源代码文件,通常用于提供给用户(访问者)查看 php代码,因为用户无法直接通过 Web 浏览器看到 php 文件的内容,所以需要用 phps 文件代替。其实,只
要不用 php 等已经在服务器中注册过的 MIME 类型文件即可,但为了国际通用,所以才用了 phps文件类型。
URL编码【urldecode(),urlencode()】
% + ascii的十六进制
$_GET,$_POST,$_REQUEST都自带一次URL解码;
若已知程序进行两次URL解码,则:
第一次解码前(原始输入) |
两次解码之间 |
第二次解码后 |
a |
a |
a |
%61 |
a |
a |
%2561 |
%61 |
a |
套娃(〃'▽'〃)
记得用Burp的Decode功能!
10. PHP代码审计
PHP序列化与反序列化
https://www.cnblogs.com/youyoui/p/8610068.html
在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。
序列化函数原型: string serialize(mixed $value)
序列化对于不同类型得到的字符串格式为:
- String : s:size:value;
- Integer : i:value;
- Boolean : b:value;(保存1或0)
- Null : N;
- Array : a:size:{key definition;value definition;(repeated per element)}
- Object : O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}
对于对象,我们可以在类中加入一个魔术方法_sleep()来自定义序列化行为,达成保存部分属性,过滤敏感属性等操作。
public array _sleep(void)
反序列化用于将单一的已序列化的变量转换回PHP值。
mixed unserialize(string $str)
若被反序列化的变量是一个对象,在成功重新构造对象之后,PHP会自动试图去调用(起过滤作用的)_wakeup()成员函数(如果存在的话)
PHP反序列化漏洞:
执行unserialize()时,若序列化字符串中属性值个数【object size】大于属性个数【不知道是啥】,就会导致反序列化异常,直接跳过_wakeup()的过滤。
11.PHP upload文件上传漏洞
PHP文件上传漏洞原理以及防御姿势:https://blog.csdn.net/levones/article/details/80654233
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?