记一次对php异或加密的解密过程

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 记一次对php异或加密的解密过程

感谢群友@rural老哥的投稿,感谢分享  。希望大家能够从中有所收获。




首先拿到了主页面


查看源码后发现了source.txt,这个页面给出了php的代码,简单查看后是php异或加密和解密代码,我对代码注释了一下


接着说说异或加密和解密

    <?php
      $string="asd";
      $key="1234567890";
      $result1=$string^$key;
      $result2=$result1^$key;
      echo $result1^$string;//获取$key值
    ?>


    这里说几个坑的位置,首先是$key会每几秒变一次,所以不能手工获取admin的加密值然后带入代码获取flag,这个可以通过bp发包看出来。


    这一点是遇到最大的坑,在代码


    这一段代码里面能获取到admin的加密值,还有一段代码也可以获取到admin的加密值



    这两段代码都可以获取到admin的加密值,这么说在获取到第一段的key之后要使过去flag的代码执行就得在获取一个key,这个key值和session是相关的。从以下代码就可以看出


    为了保证获取的key不变就得使得第二段代码成立并获取system的加密值


    现在就开始构造脚本来完成操作,由于算计获取的key值有可能是奇怪的字符所以脚本多来几次就出来了


    成功获取flag


    附件:

    Python代码

      import requests
      from lxml import etree
      from urllib.parse import  quote,unquote
      import base64
      data = {
          "username":"admin",
          "password":"admin",
          }
      cookies = "PHPSESSID=n0r1l2qb79o36a8eocjfeampr4;"#cookie中不带user字段,使得(empty($user)这个weitrue从而向客户端返回admin的加密值
      header = {
          "Origin": "http://159.75.30.182:8001",
          "Upgrade-Insecure-Requests": "1",
          "cookie":cookies,
          "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
          "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
          }
      re = requests.post('http://159.75.30.182:8001/#',data=data,headers=header)
      cookie = re.cookies#获取cookie值
      cookie = unquote(cookie['user'])#url解码cookie里面的user字段
      cookie = base64.b64decode(cookie).decode("utf-8")#base64解码cookie里面的user字段
      print(cookie)
      lis = []
      for i in cookie:#把user的每个字符都存入列表好进行异或运算
          lis.append(i)
      print(lis)
      a1 = chr(ord(lis[0]) ^ ord("a"))#这就是把获取的user的每个字符都和admin进行异或运算从而得到key,为啥要和admin运算因为从php代码来看上面获取到的就是admin的加密值
      a2 = chr(ord(lis[1]) ^ ord("d"))
      a3 = chr(ord(lis[2]) ^ ord("m"))
      a4 = chr(ord(lis[3]) ^ ord("i"))
      a5 = chr(ord(lis[4]) ^ ord("n"))
      print(a1+a2+a3+a4+a5)#组合key
      b1 = chr(ord(a1) ^ ord("s"))#这边是把key和system进行异或运算获取system的加密值,php代码里面要获取flag就是要计算得出system的加密值
      b2 = chr(ord(a2) ^ ord("y"))
      b3 = chr(ord(a3) ^ ord("s"))
      b4 = chr(ord(a4) ^ ord("t"))
      b5 = chr(ord(a5) ^ ord("e"))
      b6 = chr(ord(a1) ^ ord("m"))
      strs = b1 + b2 + b3 + b4 + b5 + b6#组合system的加密值
      print(strs)
      strs = strs.encode("utf-8")#转码
      strs = base64.b64encode(strs).decode('utf-8')#base64加密
      print(strs)
      proxies = {
              "http": "http://127.0.0.1:8080",
          }
      dataa = {
          "username":"a",
          "password":"ab",
          }
      cookies = "PHPSESSID=n0r1l2qb79o36a8eocjfeampr4;" + "user=" + str(strs) + "%3D"#组合cookie
      header = {
          "Origin": "http://159.75.30.182:8001",
          "Upgrade-Insecure-Requests": "1",
          "cookie":cookies,
          "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
          "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
          }
      #re = requests.post('http://159.75.30.182:8001',data=dataa,headers=header,proxies=proxies)
      re = requests.post('http://159.75.30.182:8001',data=dataa,headers=header)
      print(re.text)#打印获取的网页内容获取flag


      php代码

      <?php
      session_start();
      ini_set('display_errors', 0);
      require_once('config.php');
      if(!isset($_SESSION['time']) || (time() - $_SESSION['time'])>2){
          $_SESSION['time'] = time();
          $_SESSION['key'] = md5(rand_str());//随机去一个md5的加密字符串
      }
      $key=$_SESSION['key'];//把加密字符串的值赋值给key,这个key就是我们要逆推的值
      function encrypt($plain)//$plain是传入的参数
      {
          global $key;
          $r='';
          for($i=0;$i<strlen($plain);$i++){//获取$plain长度
              $k = $i % strlen($key);//获取key长度$key,经过我的验证由于i是从0开始而0-5之间与任意数字取余都是0-5
              $r.= chr(ord($key[$k]) ^ ord($plain[$i]));//这是$key的每一个字符和$plain的每一个字符进行异或运算,如果字符长度不相等就循环
          }
          return base64_encode($r);//base64加密$r
      }
      function decrypt($cipher)
      {
          global $key;
          $cipher = base64_decode($cipher);//base64解密$cipher
          $r = '';
          for($i=0;$i<strlen($cipher);$i++){//获取$cipher长度
              $k = $i % strlen($key);//获取key长度$key,经过我的验证由于i是从0开始而0-5之间与任意数字取余都是0-5
              $r .= chr(ord($key[$k])^ord($cipher[$i]));//这是$key的每一个字符和$cipher的每一个字符进行异或运算,如果字符长度不相等就循环
          }
          return $r;
      }
      if(isset($_POST['login']))//判断POST传入的login是否为空
      {
         $username = $_POST['username'];
         $password = $_POST['password'];
         if($username === $_username and $password === $_password)
         {    
              setcookie("user",encrypt('admin'));//登录成功后给客户端传回一个cookie:user=admin加密后的值
              echo "<p>Welcome admin</p>";
              echo "<p>You are not system,I can not give you flag</p>";
         }else{
              echo '<p>username or password is error</p>';
         }
      }
      else
      {
         $user=$_COOKIE['user'];//接受cookie里面user的值
         $phpsession = $_COOKIE['PHPSESSID'];
         if(empty($user))//判断user是否为空,为空的话就给客户端传回一个cookie:user=admin加密后的值
         {
             setcookie("user",encrypt('admin'));
             exit(0);
         }
         if(empty($phpsession)){
              die('Need PHPSESSID');
         }
         if(decrypt($user)==='system'){//客户端发回的cookie里面user的值解密后全等于system就返回flag
             echo "<p>welcome system, the flag is ".$flag."</p>";
         }
         else{
              echo '<p>Not authorized ! Please login</p>';
         }
      }
      ?>
      相关文章
      |
      6天前
      |
      Linux PHP 数据安全/隐私保护
      2024授权加密系统PHP网站源码
      2024授权加密系统PHP网站源码
      85 58
      |
      4月前
      |
      存储 算法 网络安全
      二进制加密PHP Webshell原理及简单实现
      二进制加密PHP Webshell原理及简单实现
      134 8
      |
      6月前
      |
      Java PHP 数据安全/隐私保护
      php和Java配合 aes
      php和Java配合 aes加密
      50 1
      |
      6月前
      |
      搜索推荐 算法 PHP
      详尽分享记6种php加密解密方法
      详尽分享记6种php加密解密方法
      659 0
      |
      6月前
      |
      算法 PHP 数据安全/隐私保护
      PHP中的数据加密技术及应用
      在Web开发中,数据安全始终是一个至关重要的问题。本文将介绍PHP中常用的数据加密技术,包括对称加密算法、非对称加密算法和哈希算法的原理和应用。通过深入了解这些加密技术,开发人员可以更好地保护用户数据和提高系统的安全性。
      71 0
      |
      7月前
      |
      存储 安全 算法
      【PHP开发专栏】PHP加密与解密技术
      【4月更文挑战第29天】本文探讨了PHP中的加密解密技术,涵盖基本概念如对称加密(AES、DES)、非对称加密(RSA、DSA)和哈希函数(MD5、SHA)。PHP提供内置函数支持加密,如`openssl_encrypt`、`openssl_pkey_new`、`hash`和`password_hash`。文章强调了最佳实践,如使用安全密钥、密钥管理和HTTPS,并给出用户注册登录的加密实战示例。通过理解和应用这些技术,开发者能增强Web应用的数据安全性。
      229 1
      |
      7月前
      |
      安全 PHP 开发工具
      php代码加密 php-screw-plus
      php代码加密 php-screw-plus
      102 0
      |
      16天前
      |
      存储 SQL 安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
      |
      17天前
      |
      SQL 安全 网络安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
      39 10
      |
      19天前
      |
      SQL 安全 网络安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
      46 10
      下一篇
      DataWorks