安全矩阵

 找回密码
 立即注册
搜索
查看: 2684|回复: 0

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

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-9-10 08:02:33 | 显示全部楼层 |阅读模式
记一次对php异或加密的解密过程 (qq.com)
记一次对php异或加密的解密过程原创 rural 潇湘信安 潇湘信安
微信号 xxxasec
功能介绍 一个不会编程、挖SRC、代码审计的安全爱好者,主要分享一些安全经验、渗透思路、奇淫技巧与知识总结。
1周前
收录于话题 #其他笔记 ,21个
                        声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
                        请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
                       

感谢群友@rural老哥的投稿,感谢分享

。希望大家能够从中有所收获。




首先拿到了主页面


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




接着说说异或加密和解密
  1. <?php
  2.   $string="asd";
  3.   $key="1234567890";
  4.   $result1=$string^$key;
  5.   $result2=$result1^$key;
  6.   echo $result1^$string;//获取$key值
  7. ?>
复制代码





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



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


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



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


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

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






成功获取flag


附件:
Python代码

  1. import requests
  2. from lxml import etree
  3. from urllib.parse import  quote,unquote
  4. import base64
  5. data = {
  6.     "username":"admin",
  7.     "password":"admin",
  8.     }
  9. cookies = "PHPSESSID=n0r1l2qb79o36a8eocjfeampr4;"#cookie中不带user字段,使得(empty($user)这个weitrue从而向客户端返回admin的加密值
  10. header = {
  11.     "Origin": "http://159.75.30.182:8001",
  12.     "Upgrade-Insecure-Requests": "1",
  13.     "cookie":cookies,
  14.     "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",
  15.     "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",
  16.     }
  17. re = requests.post('http://159.75.30.182:8001/#',data=data,headers=header)
  18. cookie = re.cookies#获取cookie值
  19. cookie = unquote(cookie['user'])#url解码cookie里面的user字段
  20. cookie = base64.b64decode(cookie).decode("utf-8")#base64解码cookie里面的user字段
  21. print(cookie)
  22. lis = []
  23. for i in cookie:#把user的每个字符都存入列表好进行异或运算
  24.     lis.append(i)
  25. print(lis)
  26. a1 = chr(ord(lis[0]) ^ ord("a"))#这就是把获取的user的每个字符都和admin进行异或运算从而得到key,为啥要和admin运算因为从php代码来看上面获取到的就是admin的加密值
  27. a2 = chr(ord(lis[1]) ^ ord("d"))
  28. a3 = chr(ord(lis[2]) ^ ord("m"))
  29. a4 = chr(ord(lis[3]) ^ ord("i"))
  30. a5 = chr(ord(lis[4]) ^ ord("n"))
  31. print(a1+a2+a3+a4+a5)#组合key

  32. b1 = chr(ord(a1) ^ ord("s"))#这边是把key和system进行异或运算获取system的加密值,php代码里面要获取flag就是要计算得出system的加密值
  33. b2 = chr(ord(a2) ^ ord("y"))
  34. b3 = chr(ord(a3) ^ ord("s"))
  35. b4 = chr(ord(a4) ^ ord("t"))
  36. b5 = chr(ord(a5) ^ ord("e"))
  37. b6 = chr(ord(a1) ^ ord("m"))
  38. strs = b1 + b2 + b3 + b4 + b5 + b6#组合system的加密值
  39. print(strs)
  40. strs = strs.encode("utf-8")#转码
  41. strs = base64.b64encode(strs).decode('utf-8')#base64加密
  42. print(strs)
  43. proxies = {
  44.         "http": "http://127.0.0.1:8080",
  45.     }
  46. dataa = {
  47.     "username":"a",
  48.     "password":"ab",
  49.     }
  50. cookies = "PHPSESSID=n0r1l2qb79o36a8eocjfeampr4;" + "user=" + str(strs) + "%3D"#组合cookie
  51. header = {
  52.     "Origin": "http://159.75.30.182:8001",
  53.     "Upgrade-Insecure-Requests": "1",
  54.     "cookie":cookies,
  55.     "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",
  56.     "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",
  57.     }
  58. #re = requests.post('http://159.75.30.182:8001',data=dataa,headers=header,proxies=proxies)
  59. re = requests.post('http://159.75.30.182:8001',data=dataa,headers=header)
  60. print(re.text)#打印获取的网页内容获取flag
复制代码

​php代码


  1. <?php
  2. session_start();
  3. ini_set('display_errors', 0);
  4. require_once('config.php');

  5. if(!isset($_SESSION['time']) || (time() - $_SESSION['time'])>2){
  6.     $_SESSION['time'] = time();
  7.     $_SESSION['key'] = md5(rand_str());//随机去一个md5的加密字符串
  8. }

  9. $key=$_SESSION['key'];//把加密字符串的值赋值给key,这个key就是我们要逆推的值
  10. function encrypt($plain)//$plain是传入的参数
  11. {
  12.     global $key;
  13.     $r='';
  14.     for($i=0;$i<strlen($plain);$i++){//获取$plain长度
  15.         $k = $i % strlen($key);//获取key长度$key,经过我的验证由于i是从0开始而0-5之间与任意数字取余都是0-5
  16.         $r.= chr(ord($key[$k]) ^ ord($plain[$i]));//这是$key的每一个字符和$plain的每一个字符进行异或运算,如果字符长度不相等就循环
  17.     }
  18.     return base64_encode($r);//base64加密$r
  19. }

  20. function decrypt($cipher)
  21. {
  22.     global $key;
  23.     $cipher = base64_decode($cipher);//base64解密$cipher
  24.     $r = '';
  25.     for($i=0;$i<strlen($cipher);$i++){//获取$cipher长度
  26.         $k = $i % strlen($key);//获取key长度$key,经过我的验证由于i是从0开始而0-5之间与任意数字取余都是0-5
  27.         $r .= chr(ord($key[$k])^ord($cipher[$i]));//这是$key的每一个字符和$cipher的每一个字符进行异或运算,如果字符长度不相等就循环
  28.     }
  29.     return $r;
  30. }

  31. if(isset($_POST['login']))//判断POST传入的login是否为空
  32. {
  33.    $username = $_POST['username'];
  34.    $password = $_POST['password'];
  35.    if($username === $_username and $password === $_password)
  36.    {   

  37.         setcookie("user",encrypt('admin'));//登录成功后给客户端传回一个cookie:user=admin加密后的值
  38.         echo "<p>Welcome admin</p>";
  39.         echo "<p>You are not system,I can not give you flag</p>";
  40.    }else{
  41.         echo '<p>username or password is error</p>';
  42.    }
  43.    
  44. }
  45. else
  46. {
  47.    $user=$_COOKIE['user'];//接受cookie里面user的值
  48.    $phpsession = $_COOKIE['PHPSESSID'];
  49.    if(empty($user))//判断user是否为空,为空的话就给客户端传回一个cookie:user=admin加密后的值
  50.    {
  51.        setcookie("user",encrypt('admin'));
  52.        exit(0);
  53.    }
  54.    if(empty($phpsession)){
  55.         die('Need PHPSESSID');
  56.    }
  57.    if(decrypt($user)==='system'){//客户端发回的cookie里面user的值解密后全等于system就返回flag
  58.        echo "<p>welcome system, the flag is ".$flag."</p>";
  59.    }
  60.    else{
  61.         echo '<p>Not authorized ! Please login</p>';
  62.    }
  63. }

  64. ?>
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-5-15 03:52 , Processed in 0.013256 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表