常见ctf-web题型及解题技巧
包含三个内容:工具集、常用套路总结及常见题型解题技巧。
来源:http://star.nsctf.cn/

工具集

基础工具:Burpsuite、Python、Firefox(Hackbar、FoxyProxy、User-Agent Swither等)

扫描工具: 御剑后台扫描工具、Nmap、AWVS

sql注入工具:Sqlmap等

XSs平台:XSS platform

文件上传工具:菜刀、cknife

文件包含工具:LFIsuite

暴力破解工具:BurpSuite暴力破解、md5Crack、Hydra、phpMyAdmin密码爆破工具

常用套路

查看源代码

查看HTTP数据包

使用抓包工具(BP)查看HTTP请求/响应头部信息。

修改或添加HTTP请求头

Referer: 来源伪造
X-Forwarded-For: ip伪造
User-Agent: 用户代理(就是用的什么浏览器)
Cookie: 维持登录状态、用户身份识别

web源码泄露

.swp vim源码泄露
备份文件泄露
.git源码泄露
SVN导致文件泄露

编码和加解密

base64加密
摩斯电码
培根密码
栅栏密码
凯撒密码
JsFuck

windows特性

短文件名

Windows为了兼容性,文件名较长的文件或者文件夹都有对应的短文件名
当创建一个长文件名时,长名目录项和对应的别名(短名)目录项的存储有以下6个处理原则:

  • 取长文件名的前6个字符加上“~1”形成长文件名的别名(即短文件名)并将长文件名中最后一部分(最后一个间隔符“.”后面字符)的前3个字符作为其扩展名。
  • 如果已存在这个名字的文件,则符号“~”后的数字会自动增加。
    任何包括小写字母的文件名都被看作是长文件名,而不管其长度是多少。如果有对于DOS和Windows3.x非法的字符,则用下划线替代。
  • 长文件名存储在属性标志为OFH的32字节目录登记项中(这是与短文件名目录项的区别)。用Unicode格式编码,每个字符(无论是英文或是汉字)均占2字节。
  • 每个目录登记项用26个字节存储13个字符(序号由第1字节指定)。位置多余时,先用00表示结束,再用FFH填充。
  • 长文件名用若干个长名目录项保存,长文件名目录项倒序排在文件短目录项前面。
  • 采用以上的存储办法后,在Windows9x下创建的长文件名在DOS或Windows3.x下就只能看见其对应的短文件名,完全忽略了长文件名。在Windows9x下运行的应用程序通过操作系统请求文件名时,Windows9x会根据应用程序的性质分别给予不同的文件名,16位应用程序得到8.3格式

例如:backup-082119f75623eb7abd7bf357698f66c.sql的长文件,其短文件是BACKUP~1.sql

IIS解析漏洞

绕过文件上传检测

PHP弱类型

PHP包含的类型有:string、integer、array、double、boolean、object、resource、NULL
==遇到不合适的类型自动转换
一些常见的弱类型比较:

  1. '123' == 123
  2. '0×01' == 1
  3. '' == 0 == false
  4. NULL == false == 0
  5. [false] == [0] == [NULL] == ['']
  6. true == 1
  7. 'abc' == 0
  8. '123a' == 123
  9. '0e123456789' == '0e987654321'

例题:strcmp字符串比较

define('FLAG','pwnhub{THIS_IS_FLAG}');
if(strcmp($_GET['flag'],FLAG)==0){
    echo"success,flag:".FLAG;
}
  • strcmp(string $str1,string $str2)
  • 如果str1str2,返回>0;如果两者相等,返回0
  • flag[]=xxx=→strcmp比较出错→返回NULL→NULL == 0→Get Flag!

例题:md5绕过

define('FLAG','pwnhub{THIS_IS_FLAG}');
if($_GET['s1']!=$_GET['s2'] && md5($_GET['s1'])==md5($_GET['s2'])){
    echo"success,flag:".FLAG;
}

两种方法:
科学计数法绕过

  • ‘0e123456789’==’0e987654321’==0
  • md5值的取值范围为 0123456789abcdef 包含e
  • 找到两个字符串md5加密后都已0e开头的字符串即可

    • md5(‘QNKCDZO’)==’0e830400451993494058024219903391’
    • md5(‘240610708’)==’0e462097431906509019562988736854’
      数组trick
  • md5函数特性:无法处理数组md5([1,2,3])==md5([4,5,6])==NULL
  • 无需再利用弱类型比较特性:[1]!==[2]&&md5([1])===md5([2])

绕WAF

常见方法

大小写混合

  • 形式:uNion sEleCt 1,2,3,4,sfRoM admin
  • 用于只针对小写或大写的关键字匹配技术,正则表达式匹配时大小写不敏感(/i)无法绕过。

使用编码(url编码、16进制)

  • ‘为%27 /为%2f
  • union select 1,table_name,3 from information_schema.tables where table_schema=数据库名的十六进制

使用注释
常见的注释符号:// , —, /**/ , # , —+ , — - , ;—a

  • /**/在构造的查询语句中插入注释规避对空格的依赖或关键字识别
  • //、#、—等用于注释后面的语句

demo:

绕过空格
/**/union/**/select/**/1,2,3,4,5 from admin

绕过关键字识别
/**/un/**/io/**/n/**/sel/**/ec/**/t/**/1,2,3,4,5 from admin

绕过关键字识别
/*!and*/ 1=2 效果显著!

使用空字节
id=1 %00 and 1=2 停止执行空字节之后的语句

使用嵌套剥离
selselectect 剥离后 select

避开自定义过滤器
例:and 转换为 a+nd 、a%nd ‘a’nd %A0and

题型3字符换空型WAF

$str=str_replace("select","",$str);
$str=str_replace("union","",$str);
$str=str_replace("into","",$str);

test.php?str=-1 uniunionon selselectect 1,2,3,4,5 from ‘admin’ limit 1
常见纸老虎1:一大堆非常严格的过滤,最后出现一处字符串替换空型WAF。

题型4字符换空型WAF加强版
字符串替换空型WAF加强版→循环替换法

$tmp_str="";
while($tmp_str != $str){
    $tmp_str=$str;
    $str=str_replace("select","",$str);
}

test.php?str=-1 UniON SeLeCT 1,2,3,4,5 FrOM ‘admin’ LiMiT 1
常见纸老虎2:通过循环替换转移注意力,实际简单的大小写变换即可绕过。