小迪安全基础

第1天-操作系统_名词_文件下载_反弹SHELL_防火墙绕过

名词解释

poc:指验证代码,能验证存在漏洞

exp:利用代码

payload/shellcode:载荷,通过哪种协议

后门是一个统称

webshell指网站后门

木马和病毒都是恶意程序

木马:可以操控电脑完成操作

病毒:破坏性的程序

反弹:拿到一个webshell,可以把它的权限移交到其他地址或者程序上

跳板:abc三台设备,a连不到c,可以通过b连接c(科学上网就是例子)

黑白盒测试:黑盒子指没有源代码只有一个目标,目标的其他情况什么都不知道的测试,

白盒子指知道目标的一些情况,比如对方的源代码服务器上开了哪些网站的测试

社会工程学:比如通常在设置密码时会使用生日手机号首字母之类作为密码,可以通过这些制作字典来破解你的账号的密码,或者伪造一个人类似诈骗也可以叫社会工程学

撞库:比如某某年百度、腾讯或QQ泄露了一些用户信息的数据库,你收集起来搭建一个平台(我们称为社工库),去找你要找的那个人的注册信息,再去其他平台尝试能否使用

社会工程学和撞库都属于针对个人的方式

ATT&CK:是一个红蓝对抗的框架,里面有各种漏洞的名称,方便书写渗透报告

https://www.cnblogs.com/sunny11/p/13583083.html

https://blog.csdn.net/weixin_43303273/article/details/83029138

操作系统

  1. 个人计算机和服务器用机

    比如渗透过程中发现对方的设备是windows2016或windows2018那么大概率是服务器机

    如果是Windows10的话就是个人电脑

  2. 权限

    用户&组,administrator带s就是用户组,不带s就是用户

    对组进行权限设置,那么在该组的所有成员都会收到限制,当当前获取的用户是一个低权限用户或普通用户,他能作的事情是有限的,所以就需要继续提权

    Windows系统上最高权限是system系统权限,我们用户一般是administrator管理员权限,为啥不是系统权限,在计算机上有一些系统文件不能删除,在这之下是user用户。

  3. 防火墙

    出战和入站策略

    一般防火墙对出战要求很宽松,对入站很严格,就是出去容易进来难

    但是在web方面的访问走的是app的协议,所以防火墙是默认允许的,还有一种防火墙叫waf就是一个第三方软件针对web的防火墙

实用案例

  1. 文件上传下载=》解决无图形化&解决数据传输

    获得了对方服务器的权限,要把工具和脚本下载到对方服务器上,就需要一些命令

    Linux:wget curl python rnby perl java等

    windows :powershell certutil bitsadmin msiexec mshta rund1132

    区分powershell和cmd:powershell命令前面有powershell并区分大小写

  2. 反弹shell=》解决数据回显&解决数据通讯

    数据回显:执行命令之后会有一些回显告诉指令是否成功

    有些地方工具是没有回显,大部分安全工具都是只负责把攻击的东西发送过去

    交互式命令也需要有回显才能正常操作如Linux的修改密码

结合案例

  1. 防火墙绕过-正向连接&反向连接&内网服务器

    1. 内网

      内网-》 xiaodi8

      xiaodi8!-》内网

      想要xiaodi8-》内网,需要在网关处写一个策略,将5577端口分给c,c再监听5577

      nc是一个工具(),-e这个参数可以将当前cmd移交到后面地址去

      nc -lvvp 加端口号 是监听端口

      ping命令能得到域名的ip地址

    2. 防火墙

      正向连接:你nc别人,出战

      反向连接:别人nc你,入站

      正向反向看以谁为基准

  2. 学会了有手就行-Fofa拿下同行Pikachu服务器

    文件下载&反弹shell:

    一些命令

第2天:Web应用_架构搭建_漏洞_HTTP数据包_代理服务器

搭建网站

需要服务器、域名

域名在购买的时候选择香港地区,(大陆地区需要备案)

服务器购买正常1核2G就可以搭一个网站

宝塔是一个集成化的工具,下面的web应用环境架构都有

建站教程去找吧

web应用环境架构

开发语言:很多

程序源码:可根据开发语言分类;应用类型分类(博客、门户、论坛);开源CMS分类(有一些程序源码开源或商用源码出来后会被命名为CMS);开发框架分类(功能)等;

中间件容器:IIS,Apache,Nginx,Tomcat,Weblogic,Jboos,glasshfish等,中间件要根据不同应用场景选择

数据库类型:Access,Mysql,Mssql,Oracle,db2,Sybase,Redis,MongoDB等,数据库类型也一样需要看需求

服务器操作系统:Windows系列、Linux系列、Mac系列等

第三方软件:phpmyadmin,vs-ftpd,VNC,ELK,Openssh等

第三方软件可有可无(看需要)其他必须要有

这里每一个都或多或少有相应的漏洞,根据分类可以更快的挖出来

一些博客

https://www.jianshu.com/p/558455228c43

https://www.cnblogs.com/cherrycui/p/10815465.html

web应用安全漏洞分类

SQL注入,文件安全(上传、下载、删除、更改、读取),RCE执行,XSS跨站,CSRF/SSRF/CRLF,反序列化,逻辑越权,未授权访问,XXE/XML,弱口令安全等

这些漏洞多是因为程序源码产生的

演示案例

  1. 请求包-新闻回帖点赞-重放数据包

    正常网页限制只能点一次赞(未登录的情况),通过代理抓包再多次发包来点赞

  2. 请求包-移动端&PC访问-自定义UA头

    为什么手机访问和电脑访问同一个页面会有不同的响应?

    因为在数据请求包中有一项叫User-Agent的东西,他会记录访问者的设备信息以及用什么浏览器访问的,就是标题上写的UA头,从而做出不同的响应

    知道这些有啥用?

    在做安全测试的时候,需要测试移动端设备的页面访问功能是否能够正常使用,这时候可以用修改ua头的方式进行测试了(只改ua头,全改放不出去包)

  3. 返回包-网站文件目录扫描-返回状态码

    修改请求头的文件名,通过burp的repeater部分的response的返回状态码来确定该文件(夹)是否存在

    这里就对应一个工具,字典扫目录,根据返回状态码确定文件是否存在

    文件存在200,文件不存在404,

    文件夹存在403,文件夹不存在404

    3xx 跳转 处置过程 判断可有可无

    5xx 内部错误 服务器问题 判断可有可无

第3天:抓包_封包_协议_APP_小程序_PC应用_WEB应用

抓包技术应用意义

针对一个网站或者APP还是小程序,对于这个目标我们不知道这个目标的信息,这时候就需要抓包

抓包应用的资产信息进行安全测试

抓包技术应用对象

网站应用、电脑应用、手机应用、小程序,因为这些东西你不知道确切的ip地址或者域名

抓包技术应用协议

很多

我们用的一些app其实也需要走web协议,针对不同的协议有不同工具来抓包

有部分应用不走HTTP/S,需要用到全局协议抓包(科来、Wireshark)

抓包技术应用支持

操作系统如Linux、Windows

演示案例

  1. WEB应用站点操作数据抓包-浏览器查看元素网络监听

    浏览器自带的工具抓包

  2. APP&小程序&PC抓包HTTP/S数据-Charles&Fiddler&Burpsuite

    安装证书,才可以抓https的网站

    我都试了以下子,不会用,还是用BP

    小程序抓包用bp需要将微信的出口改成抓包软件设置好的ip和端口

  3. 程序进程&网络接口&其他协议抓包-WireShark&科来网络分析系统

    Wireshark相对专业,需要经验

  4. 通讯器类应用封包分析发送接收-WPE四件套封包&科来网络分析系统

    封包和抓包不同之处:零散整体的区别,封包能精确到每个操作的数据包

封包抓取

代理机器人apk装到模拟器上,将模拟器流量转发到CCproxy上,再用WPE工具来监听CC进程流量,实现封包,抓其他协议时wifi的代理记得关

不同的还有一个一体化的封包工具

burpsuite 茶杯 fiddler

模拟器设置证书后

设置HTTP代理 -> 运行工具的本机IP 端口

burpsuite 茶杯 fiddler 配置代理监听抓取

wireshark 科来

不需要配置任何东西,他们抓的是网络接口,都抓

第4天:30余种加密编码进制_Web_数据库_系统_代码_参数值

识别算法编译类型

  1. 看位数
  2. 看密文的特征(数字、字母、大小写、符号等)
  3. 看当前密文存在的地方(Web、数据库、操作系统等应用)

密码存储加密

MD5值是32或16位由数字“0-9”和字母“a-f”所组成的字符串

SHAL这种加密的密文特征和MD5差不多,只不过位数是40

NTLM这种加密是Windows的哈希密码,标准通讯安全协议

AES,DES,RC4这些都是对称性加密算法,引入密钥,密文特征和Base64类似

应用场景:各类应用密文,自定义算法,代码分析,CTF安全比赛等

MD5不可逆,但是也能解密,通过枚举

就是解密不直接通过算法解密,尝试生成很多的加密或对应明文的字符去枚举

传输数据编码

BASE64值是由数字“0-9”和字母“a-f”所组成的字符串,大小写敏感,通常结尾带有符号=

URL编码是由数组“0-9”和字母“a-f”所组成的字符串,大小写敏感,通常以%数字字母间隔

HEX编码是计算机中数据的一种表示方法,将数据进行十六进制转换,它由0-9,A-F,组成

ASCII编码是将128个字符进行进制数来表示,常见ASCII码表大小规则:0-9<A-F<a-z

举例:

个人博客-URL解码

国外WEB-BASE64解码

搜狐视频-BASE64解码

应用场景:参数传递(如注入影响),后期WAF绕过干扰写法应用,视频地址还原等

JS前端代码加密

JS颜文字 jother JSFUCK

颜文字特征:一堆颜文字构成的js代码,在F12中可直接解密执行

jother特征:只用!+()【】{}这八个字符就能完成对任意字符串的编码。也可在F12中解密执行

JSFUCK特征:与jother很像,只是少了{}

后端代码加密

PHP .NET JAVA

PHP:乱码,头部有信息

.NET:DLL封装代码文件

JAVA:JAR&CLASS文件

举例:Zend(一种加密方式) ILSpy(一种反编译工具,解码dll文件) IDEA

应用场景:版权代码加密,开发特性,CTF比赛等

数据库密文加密

MYSQL MSSQL等

数据显示编码

UTF-8 GBK2312等

代码加密目的:开发者开发出来的东西不希望别人偷走,后期绕过waf将写好的攻击代码加密从而绕过检查

演示案例

  1. Web-ZZCMS-密文-MD5

    在网站数据库中获取用户密码,这个密码大多数情况是加密的,需要解密才可以使用

  2. Web-Discuz-密文-MD5&Salt

    在MD5加密基础之上又进行了一次加密

    Discus网站加密算法是:第一次md5加密后的值再加上盐值(salt)再进行md5,就是要得到的值

    例:md5(md5(‘12345’).’d82a35),其中密码是12345,盐值是d82a35

    盐值是有存储位置的,找到一样可以继续解密

  3. 系统-Windows-密文-NTLM&HASH

  4. 综合-参数-密文传输-AES&BASE64

    网站一些东西会加密

  5. CTF赛题-buuoj-single dog-JS颜文字

    buu上的一道题,图片隐写+解密

  6. CTF赛题-xuenixiang-Jsfuck-JSFUCK

其他资料

1.30余种加密编码类型的密文特征分析(建议收藏)
https://mp.weixin.qq.com/s?__biz=MzAwNDcxMjI2MA==&mid=2247484455&idx=1&sn=e1b4324ddcf7d6123be30d9a5613e17b&chksm=9b26f60cac517f1a920cf3b73b3212a645aeef78882c47957b9f3c2135cb7ce051c73fe77bb2&mpshare=1&scene=23&srcid=1111auAYWmr1N0NAs9Wp2hGz&sharer_sharetime=1605145141579&sharer_shareid=5051b3eddbbe2cb698aedf9452370026#rd

2.CTF中常见密码题解密网站总结(建议收藏)
https://blog.csdn.net/qq_41638851/article/details/100526839

3.CTF密码学常见加密解密总结(建议收藏)
https://blog.csdn.net/qq_40837276/article/details/83080460

部分解密平台:
https://www.cmd5.com
http://tmxk.org/jother
http://www.jsfuck.com
http://www.hiencode.com
http://tool.chacuo.net/cryptaes
https://utf-8.jp/public/aaencode.html

第5天:资产架构_端口_应用_CDN_WAF_站库分离_负载均衡

资产架构

一个网站两个程序,任何一个程序出现漏洞,都可以进入安全测试

WEB多个目录源码安全

bss.xiaodi8.com dz论坛

bss.xoapdi8.com wp程序

WEB多个端口源码安全

bss.xiaodi8.com dz论坛

bss.xiaodi8.com:8081 zblog程序

服务器架设多个站点安全

bss.xiaodi8.com 47.242.117.23

edu.xiaodi78.com 47.242.117.23

给到你的目标bss.xiaodi8.com 尝试对服务下edu.xiaodi78.com进行安全测试

架设第三方插件接口安全

web源码插件

web应用

eg: phpmyadmin 便于管理数据库,有些网站即使有账密一不一定登上去因为限制登录ip,这个插件就解决了外部登录不进去的问题,同时攻击者如果知道了账密就也可以登录

方便了管理人员管理数据库

也方便了攻击者进行攻击数据库

架设应用安全

服务器应用 ftp

方便管理人员进行文件操作

也方便了攻击者进行攻击FTP协议服务

信息收集就是收集这些东西,取得网站的情况决定从哪里入手

番外安全

基于域名解析安全

服务器和域名的购买地址不一定是同一地方

如果知道域名的注册商,可以尝试爆破管理域名的管理平台(不是工具是猜测账密),咋猜?之前讲过社工。

登录成功可以将域名解析改成其他ip,这叫域名劫持

基于服务器本身安全

攻击者知道了服务器的账密信息,连接登录

基于服务商安全

如阿里云,知道账密登录

或者找回密码,对应邮箱,看邮箱有没有弱口令,尝试修改密码

基于个人的安全

针对一个人,(感觉像诈骗)迪总举例是伪装学员问题然后发了一个马,获取各种信息(包括一些网站的账密)登录后修改,这也算攻击

阻碍考虑

站库分离

字面意思,数据库不在网站上而在其他的ip

CDN加速服务

和科学上网类似,给站点加节点,用户访问时候访问离用户最近的节点来达到加速的目的

对于目的站点来说,这些节点是缓存,攻击者攻击缓存对网站是没有影响的

负载均衡服务

备用服务器,用于防止主控服务器崩溃等突发情况

攻击到备用服务器,不一定能达到攻击者想要的目的

备用服务器也是使用的不是说等主服务器坏了再去用

和cdn相似

waf应用防火墙

这个就是单纯用于防止攻击的了,建立防火墙

主机防火墙

杀毒软件算

第6天:信息打点-Web架构篇_域名_语言_中间件_数据库_系统_源码获取

知识点

打点是红队的用词,意思大概是信息搜集

  1. 打点-Web架构-语言&中间件&数据库&系统等

  2. 打点-Web源码-CMS开源&闭源售卖&自主研发等

  3. 打点-Web源码获取-泄露安全&资源监控&其他等

  4. 打点-Web域名-子域名&相似域名&反查域名&旁注等

    反查ip:通过ip查找域名

信息点

基础信息,系统信息,应用信息,防护信息,人员信息,其他信息等

技术点

CMS识别,端口扫描,CDN绕过,源码获取,子域名查询,WAF识别,负载均衡识别等

演示案例

  1. 信息打点-个人博客-XIAODI8-架构&源码

www.xiaodi8.com

通过浏览器抓包发现使用apache中间件php语言以及zblog开源项目搭建的这个网站

分辨操作系统:

这里将id改成iD,如果访问正常则为Windows不正常为Linux,原因是Windows对大小写不是很敏感就是说大写小写对应的都是一个文件,而Linux是敏感的,大小写分别对应的是两个文件

但是这不是绝对的

在这样的文件下修改就分辨不出来了

还有一种判断方法是用ping命令观察TTL值的大小,这个需要去网上搜索有关TTL值判断操作系统的文章,一般接近哪个操作系统就是哪个。

上面的www.xiaodi8.com是windows操作系统服务器部署的,下面的是Linux服务器部署的

数据库和中间件可以用搭建组合端口扫描的方式知道目标网站使用了哪一种

搭建组合指的是根据语言看哪种数据库与之配合使用

端口扫描值一些数据库和中间件会开放一些特定端口

MySQL 3306

mssql 1433

oracle 1521

redis 6379

有很多这可以需要的时候去网上查

在扫描作src挖洞的时候要注意有些目标禁止主动式扫描,可能会有大量流量造成网站堵塞

看到相关规则时注意规避,防止进去喝茶

主动式:从本机出发发送流量探测目标的信息

被动式:借助网站上的接口查询

可以使用网上的一些网站扫描网站工具去扫描目标网站,这也不一定安全

利用源码可以去公开的漏洞库尝试安全测试或者白盒代码审计挖漏洞

数据库也有对应的漏洞

  1. 信息打点-某违法APP-面具约会-架构&源码

    抓包后,用php语言编写

    这些黑暗一点的软件,就需要去黑一点的地方(bing、fofa)去搜源码

  2. 信息打点-某违法应用-爱心工程-架构&域名

    通过网站信息找到公司,在通过公司搜索域名注册信息去看该网站的其他的域名,或者通过查找备案查找其他的域名,这样能搜集的信息会更多,这里的信息指的是之前说的源码中间件啥的

  3. 信息打点-某专属SRC-补天平台-架构&域名

    补天是一个漏洞挖掘”悬赏“的网站我觉得,并且上面的网站都是那种防护比较高的,比较大的网站

    这里用端口扫描就没有扫到数据库的开放端口,可能是站库分离,也可能是工具没扫成功,再就是网站设置了防火墙之类

    抓包后没有什么有用的东西,找到JSP3/2.0.12这个不知道是啥的东西,搜索之后知道和Java有关

    端口扫描应该不会奏效,因为这种大型的网站会使用CDN,你扫的是你附近的节点的服务器,最好是找真实ip扫

    源码也大概率是自己研发的,找不到

第7天:信息打点-资产泄漏_CMS识别_Git监控_SVN_DS_Store_备份

相关利用项目

CMS识别:https://www.yunsee.cn

备份:敏感目录文件扫描-7kbscan-WebPathBrute

CVS:https://github.com/kost/dvcs-ripper

GIT:https://github.com/lijiejie/GitHack

SVN:https://github.com/callmefeifei/SvnHack

DS_Store:https://github.com/lijiejie/ds_store_exp

案例演示

工具在上面

参考文章

常见的Web源码泄漏漏洞及其利用 - SecPulse.COM | 安全脉搏

直接获取-CMS识别-云悉指纹识别平台

yunsee.cn一个cms识别平台,需要花钱,需要申请

以下为识别不到的情况

习惯不好-备份文件-某黑阔博客源码泄露

在网站下备份源码,直接在该目录下压缩文件的话,用户是可以通过网站下载到的,所以备份源码不要存放在网站目录下

配置不当-GIT泄露-某程序员博客源码泄露

程序员在做项目开发的时候为了防止源代码误删,会将其备份到github上,在使用git init命令初始化的时候会创建一个.git的隐藏目录,如果他没有删除,攻击者可以通过gitahck工具获取到项目源码

需要在python2环境下使用,听说python3也有

环境变量是python3的,可以下载python2,然后再python2的文件夹下cmd,再用该目录的python.exe来使用该工具

使用方法去搜索吧

配置不当-SVN泄露-某国外小伙子源码泄露

与.git泄露相同,文件不同而已

配置不当-DS_Store泄露-某开发Mac源码泄露

PHP特性-composer.json泄露-某直接搭建源码泄露

经查找资料: composer.json文件是PHP项目的核心配置,用于描述依赖关系和自动加载规则。通过Composer工具,它可以管理项目的依赖,下载包并生成自动加载代码,提高开发效率和可维护性。require和require-dev定义不同类型的依赖,autoload配置类文件的自动加载。

了解到该文件为一种配置说明文件,访问该文件可以知道网站搭建的使用的各种配置

下载配置-WEB-INF泄露-RoarCTF-2019-EasyJava

ctf赛题会有些用,但是使用条件是要和其他漏洞配合,条件苛刻,而且可以直接从其他漏洞入手

资源监控-GITHUB泄露-语法搜索&关键字搜索&社工

没看明白,到github上搜索名字,域名,

第8天:信息打点-系统篇_端口扫描_CDN服务_负载均衡_WAF防火墙

知识点

  1. 获取网络信息-服务厂商&网络架构

    对于网络架构:用户访问网站访问的是外网ip,服务端可能是一个外网ip然后又有一个内网,在外网服务器上设置一个代理使访问走向要访问的内网数据,这时候安全测试进行探针扫描只能扫描到外网的ip而其内部设置的内网是扫描不到的

    对于这种web服务我们是扫描不到的

  2. 获取服务信息-应用协议&内网资产

    应用协议用nmap、masscan、平台扫描

  3. 获取阻碍信息-CDN&WAF&负载&防火墙

    CDN之前讲过,识别方法:超级ping(一个网站)

    WAF也说过,各家厂商有各家的产品

    WAF不是都能绕的,有一些产品要是谁都能绕那还收啥钱了

    识别方式:

    1. 看图识别,访问会提示访问被拦截之类的弹窗
    2. 工具:wafw00f (只能识别主流的waf,对于自研开发的产品是识别不到的)

    负载均衡 有扫描工具ldb

    防火墙用nmap

端口扫描工具:nmap(kali自带的)

旁注:同服务器下面的不同WEB应用查询技术,一个服务器下设多个网站,目标网站没有攻击头绪可以试试该服务器下其他的网站

c段:目标ip没有可用信息,扫描其他的ip(192.168.2.0/24这种),但是对于是自己购买的ip我认为应该是没啥用

第9天:信息打点-CDN绕过篇_漏洞回链_接口探针_全网扫描_反向邮件

知识点

  1. CDN知识-工作原理及阻碍

    CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度

    类似迅雷的下载

  2. CDN配置-域名&区域&类型、

    阿里云上有配置cdn的地方

    配置1:加速域名-需要启用加速的域名

    配置2:加速区域-需要启用加速的地区

    配置3:加速类型-需要启用加速的资源

    资源指的是网站上的文字、视频、图片、文件等

  3. CDN绕过-靠谱十余种战技战法

    https://zhuanlan.zhihu.com/p/33440472

    子域名绕过:如果目标域名只加速www这个子域名,可以尝试其他子域名,一般子域名极有可能和主站保持同一IP

  4. CDN绑定-HOST绑定指向访问

    修改C:\Windows\System32\drivers\etc目录下hosts文件,将找到的真实ip和域名绑定,这样在做安全测试的时候流量就会走向真实的ip

    上面是windows的Linux是/etc/hosts

前置知识

  1. 传统访问:用户访问域名->解析服务器ip->访问目标主机
  2. 普通CDN:用户访问域名->CDN节点->真实服务器IP->访问目标主机
  3. 带WAF的CDN:用户访问域名->CDN节点(WAF)->真是服务器IP->访问目标主机

演示案例

  1. 漏洞&遗留文件

    phpinfo.php是一个php调试文件(正常好像是删掉的),里面会有域名绑定的ip(不一定,也可能会是内网的ip,当他有多个网卡时)

    ssrf漏洞:不知道这个漏洞是啥先放一放,知道这个是一个

    www.yansiqi.com ssrf漏洞(会接受用户的数据并利用服务器去请求)

    你在自己的服务器上开一个web服务,记录日志

    漏洞去请求47.94.236.117 日志就会记录访问的ip

    就可以获得该网站的真实ip

    和第一节课说的防火墙的正向反向类似,让目标网站来找你。

  2. 子域名查询操作

    真实案例网站:www.sp910.com(子域名的问题,只加速了www)

  3. 接口查询国外访问

    国外访问用https://tools.ipip.net/cdn.php

    一些偏的国家,互联网不发达的国家,网站不需要在此处设置CDN,所以从这里访问网站可以ping出真实ip

  4. 主动邮件配合备案

    案例网站:www.mozhe.cn

    一般网站不会给自己的邮箱开CDN,那是内部人员通讯用的。所以让他给你发邮件可能会暴漏他的真实ip,在用户注册,密码找回,身份验证等情况会接到该网站的邮件

    忘记密码,输入邮箱并让其发送邮件,查看原文件就是邮件源代码

    received后面有来自发送方的信息

    有一个国外用来找真实ip的工具https://get-site-ip.com/#google_vignette结果不包真

    可以搜索该ip看归属厂商,如果是阿里云的话可能就是节点

    还可以看归属地,一般网站会有备案的信息上面有备案所属地

    也有特殊的,子域名的归属地和主站不一样

  5. 全网扫描FuckCDN

    工具下载地址https://github.com/Tai7sy/fuckcdn

第10天:信息打点-APP_小程序篇_抓包封包_XP框架_反编译_资产提取

知识点

  1. 小程序-外在-资产收集
  2. APP-外在&内在-资产收集

演示案例

  1. APP-外在抓包-Fd&茶杯&Burp

  2. APP-外在封包-封包监听工具

  3. APP-内在提取-AppInfoScanner

    使用方式到github上搜AppInfoScanner,readme后面有点知识点

  4. APP-资源提取-反编译载入IDEA

  5. APP-框架使用-Xposed&JustTrustMe

    壳:保护文件的东西,要反编译逆向就需要先脱壳

  6. 小程序-微信-电脑版登录启动抓包分析

没啥记的,复现也复现不了,代码啥的也看不明白,等学完php开发之后再跟着复现试试

APP安卓入手

1、外在-抓包封包-资产安全测试

资产收集-资源提取-ICO、MD5-黑暗引擎搜索相关资产

1.1、外在-功能逻辑-

2、 内在-反编译-JAVA代码-代码审计

2.1、内在-反编译-提取RES资源-黑暗资产收集

第11天:信息打点-红队工具篇_Fofa_Quake_Kunyu_Suize水泽_Arl灯塔

知识点

  1. 网络空间四大引擎-Fofa&Quake&Shadan&Zoomeye
  2. 自动化信息收集项目-ARL灯塔&Suize水泽&Kunyu坤舆
  3. 单点功能信息收集项目-企查&子域名&指纹识别&社工信息

黑暗引擎:

https://fofa.so

https://quake.360.cn

https://www.shodan.io

https://www.zoomeye.org

用于搜索

关联资产-特征资产-资产信息

演示案例

  1. 网络空间-Fofa&Quake&Shadan&Zoomeye
  2. 工具测评-网络空间-四大黑暗引擎集合版项目
  3. 工具测评-自动化收集-ARL灯塔&Suize水泽&Kunyu
  4. 工具测评-单点功能器-企查&子域名&指纹识别&社工

工具下载地址:推荐水泽

坤舆:https://github.com/knownsec/Kunyu

水泽:https://github.com/0x727/ShuiZe_0x727

灯塔:https://github.com/Aabyss-Team/ARL?tab=readme-ov-file(官方的没了)

灯塔有一个监控功能

实时监控设定的关键词,绑定邮箱、钉钉提醒

第12天:PHP开发-个人博客项目_文章功能显示_数据库操作_数据接受

案例演示

小迪博客-文章阅读功能初步实现

实现功能:

前端文章导航,点入内容显示,更改ID显示不同内容

实现步骤:

  1. 前端页面显示编写-HTML&CSS
  2. 数据库文章数据导入-MYSQL操作
  3. PHP操作MYSQL编写-PHP变量提交

php语言的一些语法

编写php代码用phpstom打开文件

php代码要用这个包起来

1
2
3
4
<?php


?>
1
2
3
$conn=mysqli_connect('localhost','root','root');//连接数据库,句柄赋值给conn,目的是当连接多个数据库时便于区分数据库,后面还要用数据库中的表
mysqli_select_db('stock',$conn);//选择数据库,后面的变量就是上面创建的

每一次在使用数据库的东西都要这样写很麻烦,所以我们在配置文件中配置好数据库与页面的连接

然后在使用它的地方include配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
config.php文件
<?php
$conn=mysqli_connect('localhost','root','root');
mysqli_select_db($conn,'stock');
?>
1.php文件
<?php
//操作数据库将数据取数进行展示
//$conn=mysqli_connect('localhost','root','root');
//mysqli_select_db($conn,'stock');
include("config/config.php");
$sql='select * from stock';
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_array($result)){
echo $row['id'];
echo $row['name'];
}
?>

中间没有做注释的看不懂的代码是sql语句,后面说

这里可以得到:配置文件里有数据库的账号密码,如果该文件泄露,就可以获取数据库账密

想要显示指定内容,需要做如下修改

1
2
3
4
5
6
7
8
include("config/config.php");
$i=$_GET['id'];//GET请求接收id参数名值给变量i
$sql="select * from stock where id=$i";
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_array($result)){
echo $row['id'];
echo $row['name'];
}

网页端的请求也要修改,url要传参数

这里引出一个web漏洞,sql注入,就是在传参的时候不做检查,直接使用传进来的参数就可能执行恶意指令

比如这样

1
2
3
4
5
正常期望的sql指令
select * from stock where id=1
实际有可能会执行的sql指令
select * from stock where id=1 union select 1,2,3,from admin

GET请求和POST请求

新建一个test.php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
/**
* Created by PhpStorm.
* User: ASUS
* Date: 2024/10/15
* Time: 19:58
*/

$g=$_GET['x'];
echo $g;


$p=$_POST['y'];
echo $p;
?>

浏览器输入http://localhost/blog/test.php?x=1能显示1

但是输入http://localhost/blog/test.php?x=1&y=2只能显示1不能显示2

这是因为x用的GET请求只要url有参数就能接收,而POST请求则必须发送的方式也是POST才能传参成功

利用渗透版火狐修改传参方式

通过浏览器抓包发现传参方式为POST

1
2
3
4
HTML代码:
echo '<br>'//换行
echo '<hr>'//横线

注:heml代码中可以插入php代码,php代码中也可插入html代码

1
2
3
html代码
<?php echo 123?>//在html代码中使用php代码的语法,这句是显示123
html代码1

补一些基础知识

1
2
3
4
5
6
7
8
9
10
11
12
13
单引号和双引号区别:
单引号将引号内部的东西当作字符串输出不做解析
双引号会解析引号内部的东西,有变量的会被输出出变量对应的值

$x=123;
echo $x;
echo '<br>';
echo '$x';
echo '<br>';
echo "$x";
echo '<br>';
echo "x=$x";
结果如下

MYSQL相关

查询:selete

删除: delete

插入/增加: insert

更新: update

小结:

数据库操作类的代码

文件上传

文件下载

项目一:个人博客

文章阅读

会员中心

模板引入

留言板

后台:

登录验证

文章添加

配置修改

找漏洞要从网站功能实现处入手,每一个功能实现都会有一些脆弱点

第13天:PHP开发-个人博客项目_文件操作类_编辑器_上传下载删除读写

  1. 字写代码验证上传

    验证核心在代码里

  2. 引用外部编辑器实现

    验证核心在编辑器里

  3. 引用开发框架实现

    验证核心在框架

文件上传

下面是文件上传的一种html写法

1
2
3
4
5
6
<form action="/upload" method="post" enctype="multipart/form-data">//action是将上传来的文件交由谁处理,如果为空则是当前文件自己处理

<input type="file" name="file">//这里的name用来表示上传的文件
<input type="submit" value="Upload">

</form>

php处理代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//获取文件的名字
$name=$_FILES['file']['name'];//file是上面接收文件时的name
//获取文件类型
$type=$_FILES['file']['type'];
//获取文件大小
$size=$_FILES['file']['size'];
//获取文件错误代码
$error=$_FILES['file']['error'];
//获取文件临时文件名
$tmpname=$_FILES['file']['tmp_name'];

//.是连接符
echo $name.'<br>';
echo $type.'<br>';
echo $size.'<br>';
echo $error.'<br>';//错误代码为0表示没有错误,大于0表示有错误
echo $tmpname.'<br>';

将上传的文件移动到指定位置

1
2
3
4
5
6
if(!move_uploaded_file($tmpname,'../upload/'.$name)){//第一个参数是文件名,第二个是移动路径
echo '文件移动失败';
}else{
echo '文件移动成功';
echo '/upload/'.$name;
}

可以限制文件的格式

1
2
3
4
5
6
7
8
9
10
if($type=='image/jpeg') {
if (!move_uploaded_file($tmpname, 'upload/' . $name)) {
echo '文件移动失败';
} else {
echo '文件移动成功';
echo '/upload/' . $name;
}
}else{
echo '文件格式不正确';
}

编辑器引用文件上传

html文件

1
2
3
4
5
6
7
8
<h1>编辑器引用上传</h1>
<script src="../file/ueditor/ueditor.config.js">/*引入配置文件*/</script>
<script src="../file/ueditor/ueditor.all.js">/*引入源码文件*/</script>
<textarea id="content" rows="10" cols="70" style="border:1px solid #E5E5E5;">55222</textarea>
<script type="text/javascript">
UE.getEditor("content");//实例化编辑器 传参,id为将要替换的容器。
</script>

当使用编辑器引用文件上传,此时的过滤就由编辑器处理了

文件下载

1
2
3
4
5
6
7
8
9
10
//获取文件列表函数
function getfilename(){
$filepath=getcwd();//获取当前路径
$filename=scandir($filepath.'/soft');//扫描路径下文件找soft
foreach($filename as $value){//这个是循环输出soft目录下的文件
if($value !='.'&&$value !='..'){
$arr[]=$value;
echo $value.'<br>';
}
}

下面这个函数是不起作用的,但是有些知识点是需要记的

是起作用的,一开始是写错了http,多写了一个s

1
2
3
4
5
6
7
//直连下载函数
function filenameurl($name){
$url='http://'.$_SERVER['HTTP_HOST'].'/blog/file/soft/'.$name;
//$_SERVER是获取服务器的信息,HTTP_HOST是当前请求的Host:头部的内容。就是当前访问网站的信息
//PHP_SELF当前正在执行脚本的文件名
header("location:$url");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//文件传参下载
function filenameget($name){
$filename = $name;
$download_path = "soft/";
// 使用 preg_match() 替代 eregi()
if(preg_match("/\.\./", $filename)) die("抱歉,你不能下载该文件!");
$file = str_replace("..", "", $filename);
if(preg_match("/\.ht.+/", $filename)) die("抱歉,你不能下载该文件!");

// 创建文件下载路径
$file = "$download_path$file";

// 判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");

// 文件类型,作为头部发送给浏览器
$type = filetype($file);

// 获取时间和日期
$today = date("F j, Y, g:i a");
$time = time();

// 发送文件头部

header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');

// 发送文件内容
set_time_limit(0);
readfile($file);
}

第一种下载直连下载的下载链接是http://localhost/blog/file/soft/xingtu.exe

第二种下载传参下载的下载链接是http://localhost/blog/file/file-down.php,文件是作为参数传过去的

相比而言,直连下载更安全,因为它会检测下载的文件类型,比如你要下载一个php文件它就不会下载而是去执行该文件,过滤是由那些中间件处理的。

传参下载将参数修改有可能php文件也可以下载,比如说把下面的软件.zip改成1.php

//http:www.xiaodi.com/soft/down.php?filename=软件.zip

这就造成源码泄露

看是哪种下载,可以右键复制下载链接,粘贴到地址栏查看

文件删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
file-del.php
<html>
<head>
<title>文件删除</title>
</head>
<h1>文件删除</h1>
<?php getfilename()?>
<form action="" method="post" enctype="multipart/form-data">
需要删除的文件:<input type="text" name="name">
<input type="submit" value="下载">
</form>
<?php $name=$_POST['name'];deletefilename($name);?>
<h1>文件夹删除</h1>
<?php getfilename()?>
<form action="" method="post" enctype="multipart/form-data">
需要删除的文件夹:<input type="text" name="name">
<input type="submit" value="下载">
</form>
<?php $name=$_POST['name'];deldirname($name);?>
</html>

<?php
/**
* Created by PhpStorm.
* User: ASUS
* Date: 2024/10/17
* Time: 20:42
*/
function getfilename(){
$filepath=getcwd();//获取当前路径
$filename=scandir($filepath);//扫描路径下文件
foreach($filename as $value){
if($value !='.'&&$value !='..'){
$arr[]=$value;
echo $value.'<br>';
}
}
}
function deletefilename($name){
unlink($name);
}
function deldirname($dir){
rmdir($dir);
}

删除函数就俩,写这个目的是注意在写删除文件的时候小心任意文件删除,要是源码被删网站就崩了

有报错是因为此时传入参数为空

输入删除2.txt,刷新后

这时2.txt就被删除了,此时报错是因为参数还是2.txt

删除时候注意点,不能恢复的

文件操作

分读取和写入两种

1
2
3
4
5
6
7
8
9
10
11
//读取函数
function fileread($name){
$myfile=fopen($name,"r");
echo fread($myfile,filesize($name));
fclose($myfile);
}
function filewrite($name,$txt){
$myfile=fopen($name,"a+");//这里a+表示读加写没有的文件会被创建,已存在的文件则直接在末尾添加,w+也是读加写,没有文件会创建,已存在文件会覆盖
fwrite($myfile,$txt);
fclose($myfile);
}

写入2.txt

此时就有2.txt了

不粘图了

由以上功能引出的web漏洞

核心:

  1. 可控变量
  2. 特定函数-函数的多样化

总体来说就是有功能就有对应的功能函数也就是特定函数,如果可以控制这些特定函数的参数就能实现漏洞的利用也就是可控变量

文件包含漏洞:

包含即执行!!

这是1.txt还有文件的结构

这是file-include.php文件的内容

看到file-include.php中包含了1.txt

我们分别访问两个文件

发现即使1.txt不是php文件仍然被当作脚本执行了,这就是文件包含,包含即执行

如果这个包含是一个可控变量的话,那攻击方式就能想到了

防护方式:过滤包含的文件类型,包含文件时尽量写死呗

可以包含的文件函数不止一个

第14天:PHP开发-个人博客项目_输入输出类_留言板_访问IP_UA头_来源

搜索功能

1
2
$sql="select * from sy_guestbook where gName lik '%$s%'"
//%是数据库的通配符,意为只要有$s内容的文件都搜索的到,在电脑上的通配符是*

php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
include('config/config.php');
mysqli_set_charset($conn, 'utf8');
$s=$_POST['search'];
$sql="select * from sy_guestbook where gName like '%$s%'";
echo '你搜索的 '."$s".' 结果如下:';
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_array($result)){
echo '<hr>';
echo $row['id'].'<br>';
echo $row['gName'].'<br>';
}
?>

页面是这样的

正常期望的输入和结果

但是也可以这样子

回车之后

出现了一个弹窗

之前写的是javascript语言

检查代码可以发现这段查询字段被执行了

这个叫跨站攻击,(我理解的跨站是一个网站访问另一个网站所以有点搞不明白这里为啥叫跨站)

留言板功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/**
* Created by PhpStorm.
* User: ASUS
* Date: 2024/10/18
* Time: 21:57
*/

//留言内容在数据库里
//加载前面的内容
//可以提交留言
//提交留言之后会再加载
header("Content-type: text/html; charset=utf-8");
include('config/config.php');
$i=$_POST['id'];
$n=$_POST['name'];
$c=$_POST['content'];
$q=$_POST['qq'];
if(!empty($i)) {
//INSERT INTO `sy_message` VALUES (1, 1, '随意留言板', '1030040075', '第一条留言!', NULL, NULL, '1447433541', '183.92.138.25', '湖北孝感', 0, 'yes');
$sql = "INSERT INTO `sy_message` VALUES ('$i', 1, '$n', '$q', '$c', NULL, NULL, '1447433541', '183.92.138.25', '湖北孝感', 0, 'yes');";
mysqli_query($conn, $sql);
}
$sql1="select * from sy_message";
$result=mysqli_query($conn,$sql1);
while($row=mysqli_fetch_array($result)){
echo '<hr>';
echo 'ID:'.$row['id'].'<br>';
echo '昵称:'.$row['name'].'<br>';
echo 'qq:'.$row['qq'].'<br>';
echo '内容:'.$row['message'].'<br>';
}

显示结果

不正常的留言

1
<script>alert(1)</script>

和之前一样会弹窗

这个和之前的区别是不论输入与否只要刷新就会弹窗

这是因为这条评论是保存在数据库中的,只要访问一次就会被当成代码执行一次

也是跨站攻击

这两种方式在XSS那里有名字分别是反射型和存储型

对于这种攻击的寻找方式:从能控制页面输出的地方入手,找输入输出(有框的地方都试试haha)

知识点

  1. PHP-全局变量$_SERVER

抓包测试

修改ua头

网站:https://ip.chinaz.com/ipbatch

火狐渗透版配置代理主机,插件也开着

burp配置代理,开启抓包,访问网站

正常访问此时显示的信息如图

抓包后修改ua头

放包之后

此时ua头就是修改后的123了

如果在这里写其他代码,不做过滤的情况

ip伪造

php中$_SERVER[“HTTP_X_FORWARDED_FOR”]属性用于接收ip信息,这个是可以伪造的

而有些不是用php写的,其他的服务器等直接走底层协议是不能伪造的

第15天:PHP开发-个人博客项目_登录验证_Cookie_Session_验证码安全

知识点

1、后台验证-登录用户逻辑安全

2、后台验证-COOKIE&SESSION

3、后台验证-验证码&万能密码等

登录

  1. 发送登录请求 (账号 密码)
  2. 接收账号密码
  3. 判断账号密码的准确性

正确 成功->跳转成功页面

错误 失败登录->重新登录

后台管理系统有多个文件页面(功能),为了方便验证,一般会选用cookie活session进行验证

为啥会方便验证->为啥验证

如果只是在登录的时候做一个验证的话,那你的其他的页面就不会进行检测就能使用,换句话说就是不登陆也可以使用,所以每一个页面都需要包含那个验证文件。但是如果每次访问页面都需要验证账号和密码又影星用户使用,所以就使用了cookie和session来帮助验证。

cookie:身份验证 存储到客户端浏览器内

cookie安全:cookie修改 伪造 盗取

session:身份验证 存储到服务端服务器内

session:会话劫持(session劫持)

这两个都是值,用来标识身份的

cookie验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
login.php的php部分
<?php
include('config/config.php');
header("Content-type: text/html; charset=utf-8");
$username=$_POST['user'];
$password=md5($_POST['pass']);//因为数据库中的是md5加密的,输入的密码是明文,所以需要加密
$sql="select * from sy_adminuser where username= '$username' and password= '$password' ";
$result=mysqli_query($conn,$sql);
if(mysqli_num_rows($result)) {
setcookie('user',$username);//这里设置cookie用于后面的验证
header("location:admin/add_news.php");
echo '成功!';
}else{
echo '失败!';
}
?>
这是cookie验证文件login_check.php,当然正常网站的验证不会这么潦草,这里只是给出原理
<?php
$user=$_COOKIE['user'];
if($user=='admin'){
echo '这里是后台添加文章!';
}else{
echo '验证失败!';
}
?>
之后在其他的功能页面包含验证文件,下面是login_check.php文件
<?php
$user=$_COOKIE['user'];
include('../config/login_check.php');

第一次直接访问功能页面(如果之前登陆成功了可以清空浏览器缓存再来)

可以看到这里的验证是有效的

去登陆成功

代码中写的是登录成功会跳转到add_news.php

此时我们查看cookie

从这个引出一个cookie伪造,演员:熊海

配置熊海的网站,小皮创建新的站点,要勾选创建数据库然后跟着引导走就行了

配置好后,打开网站访问/install,填好信息提交之后等着配置

之后访问/admin会跳转到登录界面

用的是火狐渗透版,下面是访问的网址,上面是跳转的网址,这时如果r后面的login改为index就是后台的登录界面,当然此时是进不去的因为没有登录过,他还会跳转到登录的界面

此时就是进行抓包修改cookie来访问后台了

毕竟是带着答案去做题的,下面是伪造cookie的思路

先是源码:

打开admin/files下的index.php看到包含了一个检查登录的文件

打开该文件查看

跟我们写的潦草检查差不多,这里只是检查cookie中user是否为空,如果为空则跳转登录界面

所以抓包之后在cookie里加一个user,让user不为空就能绕,进行未授权访问

抓包后

根迪总的不太一样,这里连cookie都没有,但是试了一下加cookie也可。

放包之后

成功访问后台,但是每一步操作都需要抓包伪造cookie

cookie盗取则是通过(一般是xss)漏洞利用获取管理员的cookie

session验证

这是部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
检查的代码
<?php

//include('../config/login_check.php');
session_start();
if($_SESSION['user']=='admin'){
echo '你是管理员!';
}else{
echo '你不是管理员!';
echo $_SESSION['user'];
}
?>
登录代码
<?php
include('config/config.php');
$username=$_POST['user'];
$password=md5($_POST['pass']);//因为数据库中的是md5加密的,输入的密码是明文,所以需要加密
$sql="select * from sy_adminuser where username= '$username' and password= '$password' ";
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_array($result)){//成功登录后
//var_dump($row); // 检查$row的内容
session_start();//启动session
$_SESSION['user']=$row['username'];//将查询结果的数据进行赋值
header("Location: admin/add_news.php");
}

?>

session像是打电话,当会话结束之后这个session就失效了,而且这个session每次会话都是随机产生的,通过抓包没有发现写好的user=什么之类的

所以只有先获取session才能进行伪造,所以叫会话劫持而不是伪造

session有时效性(好像还挺短)关闭浏览器重新登录也会失效,并且是存储在服务器的不能通过xss之类盗取

所以遇到看到了像PHPSEEID、JSPSEEID就不要考虑用cookie伪造了

只能在session有效期内劫持会话

PHPSEEID是用session_start();//启动session创建的

后台验证-验证码&万能密码等

sql指令的一些知识

1
select * from sy_adminuser where username='' or 1=1# and password='随便写'

这句放在数据库里查询可以找到账密,解释

or(或),#(注释)

所以这句就是 假 或 真=》真,所以能查到

这时我在输入用户名处输入

1
' or 1=1#

密码怎么输输不输都行

成功登录

网上说叫万能密码,利用的是sql注入

现在写的两个验证都有一个问题,就是不能防止爆破,需要加一个验证码的功能,这段就是直接复制粘贴

同样,验证码也可以绕过

验证码复用

通过抓包使用第一次成功的验证码,在burp中只修改密码

密码是错的,send返回包

再将密码改成正确的send一下

改好后放包

网上还有一些验证码插件可以识别图片中的文字

但是对于那些需要拖动的验证方式就不行了

第16天:PHP开发-个人博客项目_JS-Ajax_前端逻辑_购物_登录_上传

文件上传 - 类型 - 过滤

设计:通过JavaScript进行文件后缀筛选验证

对文件上传的后缀名进行验证,符合要求的才能上传

这个功能的实现可以由PHP或JS去实现

两种验证的区别:

PHP 验证的代码看不到 只能黑盒测试 后端 服务端

JS 验证的代码可以看到 白盒测试 前端 浏览器

这个服务端和浏览器是什么意思,指的是运行代码的位置

JS代码是能通过浏览器端绕过的,禁用JS,使js代码失效

浏览器禁用js代码的方法可以去搜索

状态回显 - 登录 - 状态码

设计:通过Ajax传递数据进行用户登录验证

好多代码看不懂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
login.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
账号:<input type="text" class="user">
密码:<input type="password" class="pass">
<button>用户登录</button>
<script src="js/jquery-1.12.4.min.js"></script>
<script>
$('button').click(function () {
$.ajax({
type:'post',
url:'ajax.php',
dataType:'json',
data:{
myUname:$('.user').val(),
myUpass:$('.pass').val()
},
success:function (res) {
if(res.infocode==1){
alert('成功登录')
}else{
alert('登录失败')
}
}
})
})
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
ajax.php
<?php
$success=array('msg'=>'ok');

$username=$_POST['myUname'];
$password=$_POST['myUpass'];
if($username=='xiaodi'&& $password=='123456'){
$success['infocode']=1;//1成功登录 0失败登录
}else{
$success['infocode']=0;
}
echo json_encode($success);

js ajax

请求->返回->读取返回的数据->JS ajax代码进行解析->结果

php

请求->返回-> 返回结果(修改后服务器不会理会)

理解:还是之前说的,js/ajax的代码处理结果到了浏览器端还是需要浏览器再处理,而这个再处理是可以被抓包修改的。

下面是修改的方法:

账密都是乱写的

此时返回的infocode一定是0

选了这个之后就也会发到“这里”,理解:把返回包也抓了

在Repeater界面send之后proxy放包,此时就抓的是返回包

将0改成1再放包

登录成功

ajax和js都是JavaScript的代码,ajax是其中用来发送数据的一种形式

当然并不是说所有的由js代码验证身份的都能绕过身份验证,要看验证之后的 代码是什么

如果之后是进入后台页面那么是可以的

参数修改 - 购物 - 参数修改

设计:通过 Ajax 传递数据进行购物验证

设计 1:商品价格以前端设置价格为准,数据接收价格后运算

和之前的登录类似,修改返回包,但是修改发送包中价格也可以达成购买成功的

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
shop.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">

<title>无标题文档</title>

</head>
<img src="iphone.jpg" width="270" height="270" alt=""/><br>
价格:8888<br>
数量:<input type="text" class="number">
<button>购买</button>
<body>
<script src="js/jquery-1.12.4.min.js"></script>
<script>
$('button').click(function () {
$.ajax({
type:'post',
url:'shops.php',
dataType:'json',
data:{
price:8888,
number:$('.number').val()
},
success:function (res) {
if(res.infocode==1){
alert('购买成功')
}else{
alert('购买失败')
}
}
})
})
</script>
</body>
</html>
shops.php
<?php
$success=array('msg'=>'ok');

$p=$_POST['price'];
$n=$_POST['number'];
$money=10000;
if($p*$n<10000){
$success['infocode']=1;//1购买成功 0 购买失败
}else{
$success['infocode']=0;
}
echo json_encode($success);

设计 2:商品价格以数据库对应价格为准,数据接收价格后运算

这个和上面比差别是价格从数据库中提取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
shops1.php
<?php
//操作数据库将数据取数进行展示
//$conn=mysqli_connect('localhost','root',);
//mysqli_select_db($conn,'stock');
include("config/config.php");
$i=$_GET['id'];//GET请求接收id参数名值给变量i
$sql="select * from shop where id=1";
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_array($result)){
echo '<hr>';
$price= $row['price'];
$imgsrc=$row['imgsrc'];
echo "<img src='$imgsrc' width='270' height='270' alt=''/><br>";
echo "价格:$price<br>";
echo " 数量:<input type='text' class='number'>";
echo "<button>购买</button>";
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">

<title>无标题文档</title>

</head>
<body>
<script src="js/jquery-1.12.4.min.js"></script>
<script>
$('button').click(function () {
$.ajax({
type:'post',
url:'shops.php',
dataType:'json',
data:{
price:<?php echo "$price"?>,
number:$('.number').val()
},
success:function (res) {
if(res.infocode==1){
alert('购买成功')
}else{
alert('购买失败')
}
}
})
})
</script>
</body>
</html>


这时修改发送包价格同样还是可以影响结果的,因为这只是发送,处理还是在shops.php(理解:后端),就是计算是在接收价格和数量计算的,所以此时抓包修改价格,后端计算用的价格还是会修改。

设计 3:商品价格以数据库对应价格为准,数据只接受数量后运算

想要价格不被前端传过来的价格影响,就需要把后端的价格获取写死或从数据库中提取

此时修改数量是可以影响结果的

设计 4:商品价格以数据库对应价格为准,数据只接受数量后做过滤运算

这个设计规范价格从数据库提取,并对数据进行过滤(不可以是负数、小数之类)

这四种设计都可以通过修改返回包的0为1(状态码infocode)

很混乱

对于抓包返回包中有json code msgbox等字样,大概率是通过js发送信息

第17天:PHP开发-个人博客项目_TP框架_路由访问_安全写法_历史漏洞

下载后用小皮配置网站,将网站根目录修改为public文件夹

网站的首页写在controler文件里

开发手册写:

1
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值

可以通过地址访问对应的函数

在该文件里写了xiaodi函数,访问之后

在Controller目录下创建新文件时注意第一个字母要大写

格式

1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

class Xiaodi extends Controller
{
public function xiaodi()
{

}
}

传参数的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

class Xiaodi extends Controller
{
public function xiaodi()
{

}
public function y(){
$x=$_GET['x'];
echo $x;
}
}

url:http://tp:8082/index.php/index/xiaodi/y?x=1

1
2
3
4
5
public function y(){
//$x=$_GET['x'];
$x=input('x');
echo $x;
}

这种的传参方式是这样的url:http://tp:8082/index.php/index/xiaodi/y/x/1或者http://tp:8082/index.php/index/xiaodi/y/x=1

手册里写的是:

1
2
input('?get.id');//get传参
input('?post.name');//post传参

如果没写传参方式就都接受

讲这个,是为了以后遇到这种使用tp的网站可以了解网站的文件结构

1
2
3
4
5
6
7
8
9
10
tp官方数据库写法
Db::table('think_user')->where('status',1)->selete();
本例中:
Db::table('sy_message')->where('id',$id)->selete();



$id=$_GRT['x'];$id可以接受变动(指的是sql注入的问题)
$id=input('x');$id可以接受变动
$id=input('?get.x');被过滤了,内置过滤

对于一些程序,你如果看到了使用tp框架编写的并且按照开发文档写的,挖它的漏洞就等于是挖tp的漏洞

遇到就放弃吧

用tp框架找漏洞

  1. 看写法(语法是否是按照官方写的)

  2. 历史漏洞,对应版本有对应的漏洞

    这个是一个专门收集thinkphp框架漏洞的项目https://github.com/Mochazz/ThinkPHP-Vuln

    白盒测试:看源码版本号在thinkphp目录下的base.php里(并不是都在这里,找不到的时候就全局搜索,ctrl+shift+f,搜索词:THINK_VERSION)

    黑盒测试:判断是不是tp 看返回数据包、报错提示

    经验:看URL地址

对于历史漏洞,还要看它有没有修复

挖洞注意守法,挖出来个人是不能公开的要上报