netforce exploit

本文详细介绍了如何利用PHP的include漏洞和SQL注入技术解决Netforce平台上的训练关卡,包括Nice include system、Source Cooking!、Hiding in a pipe...、UNION makes FORCE和SeSSxploit等挑战,涉及文件包含、nullbyte利用、SQL模拟器、union查询以及PHP会话劫持等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久没有上netforce了,当年做了几道javascript的题就撂下了.现在寻思着拿起来,但实在是被js恶心到了,于是跳过了上面的很多东西,直接到了下面的exploit部分.二话不说开战吧


Training - Nice include system

从标题到url,无不透着一股提示的味道.

瞄一眼url,就能看出这个网页的后台语言是php.include无疑指的就是php的include函数.该函数的作用跟c的include差不多,就是把一个文件包含进当前文件当中.而总有那么些程序员,它们会把include的参数用get的方式提交.这就给了心怀不轨的人一个机会,一个自由访问任何能想的到的文件名的机会.

由于提示已经给的很明显了.我们只要把url中参数的值改成/etc/passwd就可以了.成功~于是就看到了这个文件的内容.很容易找到目标:netforce.我们知道,passwd当中的值都是加过密的,为了解密,只要把得到的hash扔进john the ripper 里就好了.它会自动识别并破解的.于是就得到了想要的结果.

 

 

Oops, a typo...

这道题嘛,已经把流程都设计好了,直接跟进就好.
点进第一个链接,发现它写着一堆东西,大概意思是只能用特定ip访问.一开始我的思路被误导到了,要修改自己的ip发http包这个方向上.
然后发现好像没那么复杂,上面那句"undefined"隐约暗示着,这个所谓的ip可能仅仅只是一个php的变量而已.于是,尝试着在url的后面加上ip=213.75.238.147这样的参数提交上去.
果然顺利搞定第一个障碍.
点进第二个链接,发现只显示了个Access Denied
瞄了一眼参数,还是很明显,把denied这参数去掉就好了.
小提醒一下,貌似这个网页有个自动跳转机制,因此建议以curl来访问,能看到跳转的全过程,不会忽略重要的细节.
然后就能看到一个叫做show=no的参数
那么很果断,把show改成yes吧.
终于,看到了最后的密码.

 

Source Cooking!

该网页提供了一个可以浏览源代码的链接,然而它做了一定限制,只允许访问html文件的源代码.
而我们要寻找的点,无疑是在challenge.php这个文件当中
于是问题的关键就在于,怎么查看challenge.php的源代码,又让php认为它是一个.html文件.

首先不断测试url的值,可以发现source.php的行为大致是,首先判断文件是否存在,再判断后缀名,再读入文件或显示错误.
为了达到上述的欺骗效果,需要了解php的一个bug:nullbyte.
php用c语言实现,因此很多地方,会受到c的字符串风格的影响,将\0视作字符串的结尾.经过测试,不是所有的地方都会有这个问题.echo,字符串比较等都不会有这个问题,然而涉及到用字符串作参数,操作文件的时候,往往会受此影响.
比如判断是否是文件的is_file函数.

于是构造url=challenge.php%00.html 就可以顺利获得challenge.php的内容.
了解到,只要将NetForce的MD5在cookie里提交上去就可以获得密码了.
P.S.在这里出了一些小问题,linux自带的MD5sum和python的hashlib的计算结果不同,结果证明python的计算结果是对的,我一下子也搞不清楚是怎么回事.

Hiding in a pipe...

点进链接之后,可以看到三个输入框.大概尝试了一下,就是分别执行了label标注的那几个命令.看到这种输入,我果断尝试了用分号和&&的方法,尝试注入另外一个命令,然而没有成功.由于题目里已经很明确提到了pipe,用管道再尝试.试了很多个命令都显示command not found.只有ls和cat成功了.
尝试cat /etc/passwd,没权限.尝试ls当前目录,找到了一个加密的需要密码访问的文件夹,和一个表明已经过了第一关的txt.然后再次陷入困顿.

然后好像哪里有点不对劲,我用finger的命令自带的那个user和空密码顺利访问了那个文件夹,然后在里面找到了密码.第一次尝试提交不成功,因为我没把后面的叹号一起复制进去
可问题是,为什么forum里面他们谈论起这道题给我一种很高深莫测的感觉,是题目改了还是我走了什么错误的捷径?

 

UNION makes FORCE

说起来,这道题其实挺坑的.由于提供了源码,一看就知道这道题肯定是sql注入.当我随手测试了一下这个注入点,却发现无论我怎么修改自己的查询语句,总是显示语法不正确.对照着以前的程序和mysql的书,百思不得其解,什么莫名其妙的状况.
后来在forum里面看了很多,虽然还是没思路,但总算知道了事情的真相是,这后面并没有一个真正的mysql服务器,只有一个模拟的程序,因此对于不是很接近答案的结果,它都会显示错误.

不再去考虑语法错误,可以正式开始思考这个问题了.
我们要做的事情是:使得password的md5hash与查询出来的第一条语句的结果相同.然后,再考虑题目里就有union,采用union查询已经无可非议了.
由于我们不知道数据库里任何一条内容,也不太可能知道,唯一的方法便是我们自己去生成这么一个MD5.与自己输入的password相匹配即可.
我组织了一条这样格式的语句: ' union select (....) from users where ''=' , 括号里的内容是一个password的md5hash
还是语法错误,我有点困惑了.很快发现,右下角还有一条注释,要求语句最短.我想了想自己好像忘了在md5外面加上引号,于是修改成了:
' union select '...
最大限度精简了语句,也利用上了原本自带的单引号.顺利通过.

 

 

SeSSxploit

这道题其实说难不难,由于提供了全套的源代码,所以只要阅读并理清思路就好。
从代码中可以明显看出服务器的php打开了register_global的开关。这个东西在php5.3已经被废弃了,效果是将所有get,post什么的参数都注册为全局变量。这也就提供了一个hack内部变量的接口。
由于要求是将Data['level']的值修改成八,hack无疑从Data入手。不明觉厉的是,我用get提交Data=8之后,竟然直接就过了。接下来实验了一下,不管提交Data=什么都会被注册到level那里,弄得我很困惑。如果有人弄明白了一定告诉我。

 

 

Step by step

这道题似乎挺丧心病狂的,我开始做的时候查看了一下数据,只有13个人通过了它,而且上一个通过的记录已经是在三年前了……

第一个登陆框,一开始我以为是sql注入,多番尝试无果。仔细想想,没有错误显示,如果要sql注入的话只能基于时间盲注,搜索量似乎有点大。毕竟对于任何信息一无所知。
然后在胡乱尝试的过程中,发现输入guest和admin作为账户的时候,提示是密码错误而非平时的账号密码错误。无疑证明这两个账户是存在的。
admin/admin尝试未果,guest/guest一遍成功。只能说永远不要忘了最简单的弱口令逻辑错误。

登陆进去以后,根据它是提示可以看到,用setup和admin登入可以创建新账号。
用setup登陆提示,setup账户被config.php禁用。访问config.php显示空白。
在登陆进去的界面把secure后缀去掉,发现可以看到LeetSS目录下的所有文件列表。在readme文件夹可以看到leetSS的一系列信息,不知道是否有用。
明显有用的一个文件是:basic_functions.inc,一个完整的php函数文档。

观察secure页面的源代码,找到如下一句被背景图片覆盖的“/home/www/net-force/challenge/level407/LeetSS/secured/userpages/193715251C371040.inc”
尝试可以得知,该文件夹无法访问,只能访问该.inc文件。这个似乎就是访问secure出现的页面的源代码。
用basic_function.inc当中的SimpleEncode函数对admin加密,发现加密出来的结果为:1816112D1A163840。与193715251C371040的格式相当接近。
尝试加密guest,果然就是193715251C371040,于是可以猜想另一串数字就是admin的网页。
访问该网页,没什么有价值的内容,大致是admin的密码就是我们需要的最终答案。
尝试加密setup:1C3615341D170040。访问对应网页,找到一个setup/,和setup的密码setuppassword
考虑到denyAccessToSetup这个变量控制了setup是否可以登陆。可能能通过get方法注入该参数。很不幸,尝试在post参数中注入失败。仍旧无法登陆。

<b>Notice</b>:  Use of undefined constant user - assumed 'user' in <b>/home/www/net-force/challenge/level407/LeetSS/secured/userpages/193715251C371040.inc</b> on line <b>3</b><br /><br />
将注意力放到secure页面上面这句话当中,显然在这句话中使用了一个未定义的常量,而php自动采用了xxxx.inc当中定义的那一个。
回忆在xxxx.inc当中看到的,  $username = $_SESSION[$sessionDataName][user]["name"];     这里的确有一个定义的常量,可以猜测它是在登陆时定义的。
由于这里产生了作用域的问题,可以考虑能否用一个更高优先级的user覆盖掉另一个user。寻找无果。

考虑phpsessionid注入的方法。几次登入登出查看PHPSESSIONID,恐怕其并非可以注入。

简单来说,其实我还没搞定啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值