2月月赛出题记录

出题记录

第二次出题,紧接着第一次没多久?其实还是有点仓促的,没有什么积累,中间还有半个月寒假,完全没学习…

是放假前看红日安全团队的那个代码审计项目的时候,想到可以拿这个来出个题目(Day6)。我在师兄两年前的github上看到了对应的内容…这是一个很老很老很老的知识点了哇…

就按照那个的套路,放到sql查询里面,刚开始一直想着把这点实现(也就是把漏洞点埋好),没有去考虑怎么利用漏洞点,导致写好漏洞点之后,根本没办法利用…后来又改了改。把过程中卡住的地方都记录下来。

过程

假期前一直想着弄个二次注入…没有想成熟,开学来了就直接打算按照原本题目的套路来。

web要实现的功能就是允许用户注册、登录、发表、修改内容。建立对应的文件,一个一个去写。其中的db.php register.php login.php的代码都有参考了35c3题目的源代码,确实数据库要在多个文件里都用到,建立一个类随处调用很方便。

where子句的问题

基本的逻辑代码完成之后,开始完善漏洞点部分。做题目时,实现了单引号逃逸之后肯定是要补全一整句update语句:
update red set username='hello#\\' where username like 'hello#%'#' where username like 'hello#%'

这种情况下我传入的content就是
\' where username like 'hello#%'#
在经过addslashes()函数之后会变成
\\\' where username like \'hello#%\'#
因为最开始我是用双引号来包含这个sql语句的,"\'" 是不会认为反斜杠是用来转义的,所以最终执行的sql语句带有反斜杠,所以会报错,无法成功执行。在这里绕了很长时间,具体不在这个问题上纠结了,反正就是单引号和双引号的一个差别。

在这里插入图片描述

在这里插入图片描述

感觉自己基础功夫太不扎实了。
php中用单引号会比双引号快
+ 双引号串中的内容可以被解释而且替换,
+ 而单引号串中的内容总被认为是普通字符。

(可能等之后再看的时候就忘记卡住我的是什么了…记着这个知识点就好了)

最后解决这个问题:将原本的单行update语句换成了多行的,就不需要管where子句的问题了?

ERROR 1292 (22007): Truncated incorrect INTEGER value:问题

在尝试写payload的时候发现不能执行
set username='hello#\\'^((select hex(flag) from flag)这样的语句,查了一下常见的通过update语句进行sql注入的方法,发现都是这样的啊(我还觉得自己很机智,在没查之前就想到了,果然知识的积累还是很有用的)…
然后看到一个帖子说:在mysql5.7.5之后,你可能发现,这样并不能成功执行,报错就是小标题的那个错,原因就是数据库默认设置了严格模式,通过执行下面这条语句,关闭严格模式就可以了。
set @@global.sql_mode=(select replace(@@global.sql_mode,'STRICT_TRANS_TABLES',''));

这个问题也解决了。

然后发现这样确实是可以把flag的相关内容查询出来了,但是改掉了数据库中的内容,我写的查询是根据username来查询的,改掉之后的数据库内容并不包含username,只有一串数字。想了一下,发现没办法使得修改后的数据库开头为username#形式,没办法,不能通过修改数据库,再查询的形式将flag展示出来了。最后就只能通过错误信息回显了。

emmm…也没有遇到很多问题嘛…

另外,以前没有写过保持会话的东西,这次用到了,就直接用个session,很方便哦,相关的session文件会保存到/var/lib/php/session目录下。
这个文件就是跟那个upload_progress有关的文件,之前还做过那个session serialize handlersession unserialize handler不相同,导致出错的题目。

Dockerfile

上次没有用docker-compose,这次又要新的尝试。(感觉之前总结的那些经验,时间长没用,都有点忘记了,然后之前纸上谈兵看的那些docker-compose的内容也有点忘记了)
不知道自己写的是不是正宗的那种哦,测试了一下是可以用的,慢慢学习。

这次在环境配置中没有出现太多的问题。
刚开始弄好之后发现mysql连接不上,问了一下大佬,原来在执行mysqli_connect函数的时候host参数是和docker-compose.yml中的mysql那个docker的名称对应的,只要写成那个就可以了。

后来还连接不上是因为初始化配置语句没有正确执行,都是一些小问题了。

其他

第一次创建了自己的repo,用来放自己出的题目,捣鼓了半天git那个指令怎么直接上传,反正不行,我又很着急,没耐心看,最后直接用了github desktop,嗯…现成的就是方便,图形化界面,不用指令。然后我也知道了怎么直接在github上传文件,猜测大佬应该是用指令形式上传的。

还是要学习一下这个git是怎么回事,以前就看过的,但是以前没基础,现在比以前好点了,应该更能理解了吧。我还记得文哥当时说你用git pull,我说为啥不直接下载下来,文哥说,还有一些其他的功能,你以后就知道了。?嗯…我成长了。

想再配置一下remote vscode,或者有一套自己的出题方法。在哪里调试,编辑代码。在vim里编,感觉还是不如在vscode里来的方便。


2019.03.22更新
https://blog.csdn.net/littlelittlebai/article/details/88733975
配置了一下VSCode远程编辑,具体过程以及原理理解放到这里啦~


好了好了,废话说完了…

月赛结束

月赛结束了,有两个队做出了这个题,还不错(从奖金的角度来说,是很不错的啦,哈哈哈哈哈)。

问了其中一个做出题目的是非预期解,是因为preg_replace不能匹配回车。payload为:'(select 1 from (select count(*), concat(floor(rand(0)*2),0x23,(select flag from flag))x from information_schema.tables group by x )a)'

另外一个做出题的,看数据库应该是预期解…

emm…我要说我的一个智障问题,我明明记得我是写了过滤函数的,而且我记得我测试过了,是会将那些用来报错注入的函数都过滤掉的…结果…在部署的代码里我没有调用那个函数…也不知道是啥时候改的了…更不知道为什么改???嗯???黑人问号脸…

没有上来就被打的稀巴烂很开心了。??昨天还想着我一个菜鸡到底为什么要出一道审源码的题??还不处处是洞。
行吧行吧。就这样了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值