所有由admin发布的文章

php安全模式下被限制或屏蔽的函数

有时候开启安全模式 结果老在报错下面来看下被安全模式限制或屏蔽的函数

以下安全模式列表可能不完整或不正确。

安全模式限制函数
函数名

限制
dbmopen() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
dbase_open() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
filepro() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
filepro_rowcount() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
filepro_retrieve() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
ifx_* sql_safe_mode 限制, (!= safe mode)
ingres_* sql_safe_mode 限制, (!= safe mode)
mysql_* sql_safe_mode 限制, (!= safe mode)
pg_loimport() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
posix_mkfifo() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
putenv() 遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文档。
move_uploaded_file() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
chdir() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
dl() 当 PHP 运行在 安全模式 时,不能使用此函数。
backtick operator 当 PHP 运行在 安全模式 时,不能使用此函数。
shell_exec()(在功能上和 backticks 函数相同) 当 PHP 运行在 安全模式 时,不能使用此函数。
exec() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
system() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
passthru() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
popen() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
fopen() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
mkdir() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
rmdir() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
rename() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
unlink() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
copy() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (on source and target)
chgrp() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
chown() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
chmod() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 另外,不能设置 SUID、SGID 和 sticky bits
touch() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
symlink() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
link() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
apache_request_headers() 在安全模式下,以“authorization”(区分大小写)开头的标头将不会被返回。
header() 在安全模式下,如果设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该标头的 realm 部分。
PHP_AUTH 变量 在安全模式下,变量 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 在 $_SERVER 中不可用。但无论如何,您仍然可以使用 REMOTE_USER 来获取用户名称(USER)。(注意:仅 PHP 4.3.0 以后有效)
highlight_file(), show_source() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)
parse_ini_file() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)
set_time_limit() 在安全模式下不起作用。
max_execution_time 在安全模式下不起作用。
mail() 在安全模式下,第五个参数被屏蔽。(注意,仅自 PHP 4.2.3 起受影响)
任何使用 php4/main/fopen_wrappers.c 的函数 ??

php命名空间的介绍与使用。

大开php5.3的版本才可以使用

php命名空间的介绍与使用

file  test1  第一个文件test1.php

file  test2  第二个文件test2.php

file  test3  第三个文件test3.php

file 4 引入前三个文件index.php

(PHP 5 >= 5.3.0)

**命名空间必须是程序脚本的第一条语句

**非常不提倡在同一个文件中定义多个命名空间

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件foo.txt 可以同时在目录/home/greg/home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到/home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。下面是一个说明 PHP 命名空间语法的示例:

命名空间语法示例

namespace my\name; // 参考 “定义命名空间” 小节

class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; //

$a = strlen(‘hi’); // 参考 “使用命名空间:后备全局函数/常量” 小节

$d = namespace\MYCONST;

使用__NAMESPACE__动态创建名称

关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。

 

php工厂模式的介绍与使用

工厂模式:

由工厂类根据参数来决定创建出哪一种产品类的实例;

工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。

简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;

代码实现

示例1(最基本的工厂类):

<?php

 

class MyObject {

 

public function __construct(){}

 

public function test(){

return ‘测试’;

}

 

}

 

class MyFactory {

 

public static function factory(){

//返回对象的实例

return new MyObject();

}

 

}

 

//调用工厂类MyFactory中的静态方法,获取类MyObject的实例

$myobject=MyFactory::factory();

echo $myobject->test();

 

示例2

<?php

//简单工厂模式

/1*

* 定义运算类

*/

abstract class Operation {

 

protected $_NumberA = 0;

protected $_NumberB = 0;

protected $_Result  = 0;

 

public function __construct($A,$B){

$this->_NumberA = $A;

$this->_NumberB = $B;

}

 

public function setNumber($A,$B){

$this->_NumberA = $A;

$this->_NumberB = $B;

}

 

/1*

protected function clearResult(){

$this->_Result  = 0;

}

*/

 

public function clearResult(){

$this->_Result  = 0;

}

 

//抽象方法无方法体

abstract protected function getResult();

 

}

 

//继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;

//另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)

class OperationAdd extends Operation {

 

public function getResult(){

$this->_Result=$this->_NumberA + $this->_NumberB;

return $this->_Result;

}

 

}

 

class OperationSub extends Operation {

 

public function getResult(){

$this->_Result=$this->_NumberA – $this->_NumberB;

return $this->_Result;

}

 

}

 

class OperationMul extends Operation {

 

public function getResult(){

$this->_Result=$this->_NumberA * $this->_NumberB;

return $this->_Result;

}

 

}

 

class OperationDiv extends Operation {

 

public function getResult(){

$this->_Result=$this->_NumberA / $this->_NumberB;

return $this->_Result;

}

 

}

 

class OperationFactory {

 

//创建保存实例的静态成员变量

private static $obj;

 

//创建访问实例的公共的静态方法

public static function CreateOperation($type,$A,$B){

switch($type){

case ‘+’:

self::$obj = new OperationAdd($A,$B);

break;

case ‘-‘:

self::$obj = new OperationSub($A,$B);

break;

case ‘*’:

self::$obj = new OperationMul($A,$B);

break;

case ‘/’:

self::$obj = new OperationDiv($A,$B);

break;

}

return self::$obj;

}

 

}

 

//$obj = OperationFactory::CreateOperation(‘+’);

//$obj->setNumber(4,4);

$obj = OperationFactory::CreateOperation(‘*’,5,6);

echo $obj->getResult();

/1*

echo ‘<br>’;

$obj->clearResult();

echo ‘<br>’;

echo $obj->_Result;

*/

 

示例3:

<?php

//抽象工厂

 

//青铜会员的打折商品

class BronzeRebateCommodity {

//描述

public $desc = ‘青铜会员的打折商品’;

}

 

//白银会员的打折商品

class SilverRebateCommodity {

public $desc = ‘白银会员的打折商品’;

}

 

//青铜会员的推荐商品

class BronzeCommendatoryCommodity {

public $desc = ‘青铜会员的推荐商品’;

}

 

//白银会员的推荐商品

class SilverCommendatoryCommodity {

public $desc = ‘白银会员的推荐商品’;

}

 

//各个工厂的接口

interface ConcreteFactory {

//生产对象的方法

public function create($what);

}

 

//青铜工厂

class BronzeFactory implements ConcreteFactory {

 

//生产对象的方法

public function create($what){

$productName = ‘Bronze’.$what.’Commodity’;

return new $productName;

}

 

}

 

//白银工厂

class SilverFactory implements ConcreteFactory {

 

//生产对象的方法

public function create($what){

$productName = ‘Silver’.$what.’Commodity’;

return new $productName;

}

 

}

 

//调度中心

class CenterFactory {

 

//获取工厂的方法

public function getFactory($what){

$factoryName = $what.’Factory’;

return new $factoryName;

}

 

//获取工厂的静态方法

public static function getFactory2($what){

$factoryName = $what.’Factory’;

return new $factoryName;

}

 

}

 

//实例化调度中心

$center  = new CenterFactory();

//获得一个白银工厂

$factory = $center->getFactory(‘Silver’);

//让白银工厂制造一个推荐商品

$product = $factory->create(‘Commendatory’);

//得到白银会员的推荐商品

echo $product->desc.'<br>’;

 

//获得一个青铜工厂

$factory2 = CenterFactory::getFactory2(‘Bronze’);

//让青铜工厂制造一个打折商品

$product2 = $factory2->create(‘Rebate’);

//得到青铜会员的推荐商品

echo $product2->desc;

 

示例4:

<?php

//使用工厂类解析图像文件

interface IImage {

 

function getWidth();

function getHeight();

function getData();

 

}

 

class Image_PNG implements IImage {

 

protected $_width,$_height,$_data;

 

public function __construct($file){

$this->_file = $file;

$this->_parse();

}

 

private function _parse(){

//完成PNG格式的解析工作

//并填充$_width,$_height和$_data

$this->_data   = getimagesize($this->_file);

list($this->_width,$this->_height)=$this->_data;

}

 

public function getWidth(){

return $this->_width;

}

 

public function getHeight(){

return $this->_height;

}

 

public function getData(){

return $this->_data;

}

 

}

 

class Image_JPEG implements IImage {

 

protected $_width,$_height,$_data;

 

public function __construct($file){

$this->_file = $file;

$this->_parse();

}

 

private function _parse(){

//完成JPEG格式的解析工作

//并填充$_width,$_height和$_data

//$this->_width  = imagesx($this->_file);

//$this->_height = imagesy($this->_file);

$this->_data   = getimagesize($this->_file);

list($this->_width,$this->_height)=$this->_data;

}

 

public function getWidth(){

return $this->_width;

}

 

public function getHeight(){

return $this->_height;

}

 

public function getData(){

return $this->_data;

}

 

}

 

//工厂类

class ImageFactory {

 

public static function factory($file){

 

$filename = pathinfo($file);

switch(strtolower($filename[‘extension’])){

case ‘jpg’:

$return = new Image_JPEG($file);

break;

case ‘png’:

$return = new Image_PNG($file);

break;

default:

echo ‘图片类型不正确’;

break;

}

if($return instanceof IImage){

return $return;

}else{

echo ‘出错了’;

exit();

}

 

}

 

}

 

$image = ImageFactory::factory(‘images/11.jpg’);

var_dump($image->getWidth());

echo ‘<br>’;

print_r($image->getheight());

echo ‘<br>’;

print_r($image->getData());

spl_autoload_register()函数的使用与介绍、跟__autoload()有什么区别

__autoload()函数spl_autoload_register()函数都是用来自动加载的有什么区别呢?

第一个index.php

加载test1.php
加载test2.php

下面看下test1.php

下面看下test2.php

修改include为自动加载 如果__autoload 函数加载两次会报致命错误

 

可以自动加载下面来试下spl_autoload_register()函数

spl_autoload_register()函数可以加载多次

PHP range()函数定义和用法

php中range()函数定义和用法

典型用法如下

例子:建立1-9的9个数字的数组(骰子)

$die = range(1,9);

建立0-100所有双数的数组

$even  = (0,100,2);//步长为2

这个函数不仅仅可以用作数字,还可以用作字母.

$words = range(‘A’,’Z’);

将建立包含A到Z的的所有字母的数组.此处可以用于生成验证码函数.

range() 函数创建并返回一个包含指定范围的元素的数组。

参数 描述
first 必需。规定数组元素的最小值。
second 必需。规定数组元素的最大值。
step 可选。规定元素之间的步进制。默认是 1。

注释:该参数是 PHP 5 中加入的。

输出:

例子 2

输出:

例子 3

输出:

SQL注入工具SQLmap入门手册

 

什么是SQLmap?

SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹、访问底层文件系统、执行命令)。

读者可以通过位于SourceForge的官方网站下载SQLmap源码:http://sourceforge.net/projects/sqlmap/

当给sqlmap这么一个url的时候,它会:

sqlmap支持五种不同的注入模式:

sqlmap支持的数据库有:

可以提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。

测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。

可以设定HTTP(S)请求的并发数,来提高盲注时的效率。

Youtube上有人做的使用sqlmap的视频:

http://www.youtube.com/user/inquisb/videos

http://www.youtube.com/user/stamparm/videos

使用sqlmap的实例文章:

http://unconciousmind.blogspot.com/search/label/sqlmap

可以点击https://github.com/sqlmapproject/sqlmap/tarball/master下载最新版本sqlmap。

也可以使用git来获取sqlmap

之后可以直接使用命令来更新

或者

更新sqlmap

如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。

共有七个等级,默认为1:

如果你想看到sqlmap发送的测试payload最好的等级就是3。

获取目标方式


目标URL

参数:-u或者–url

格式:http(s)://targeturl[:port]/[…]

例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users

从Burp或者WebScarab代理中获取日志

参数:-l

可以直接吧Burp proxy或者WebScarab proxy中的日志直接倒出来交给sqlmap来一个一个检测是否有注入。

从文本中获取多个目标扫描

参数:-m

文件中保存url格式如下,sqlmap会一个一个检测

从文件中加载HTTP请求

参数:-r

sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)。

比如文本文件内如下:

当请求是HTTPS的时候你需要配合这个–force-ssl参数来使用,或者你可以在Host头后面加上:443

处理Google的搜索结果

参数:-g

sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)。

例子:

(很牛B的功能,测试了一下,第十几个就找到新浪的一个注入点)

此外可以使用-c参数加载sqlmap.conf文件里面的相关配置。

请求


http数据

参数:–data

此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。

例子:

参数拆分字符

参数:–param-del

当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数。

例子:

HTTP cookie头

参数:–cookie,–load-cookies,–drop-set-cookie

这个参数在以下两个方面很有用:

1、web应用需要登陆的时候。

2、你想要在这些头参数中测试SQL注入时。

可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。

在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。

如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。

当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。

HTTP User-Agent头

参数:–user-agent,–random-agent

默认情况下sqlmap的HTTP请求头中User-Agent值是:

可以使用–user-anget参数来修改,同时也可以使用–random-agnet参数来随机的从./txt/user-agents.txt中获取。

当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。

HTTP Referer头

参数:–referer

sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入。

额外的HTTP头

参数:–headers

可以通过–headers参数来增加额外的http头

HTTP认证保护

参数:–auth-type,–auth-cred

这些参数可以用来登陆HTTP的认证保护支持三种方式:

1、Basic

2、Digest

3、NTLM

例子:

HTTP协议的证书认证

参数:–auth-cert

当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。

key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。

HTTP(S)代理

参数:–proxy,–proxy-cred和–ignore-proxy

使用–proxy代理是格式为:http://url:port。

当HTTP(S)代理需要认证是可以使用–proxy-cred参数:username:password。

–ignore-proxy拒绝使用本地局域网的HTTP(S)代理。

HTTP请求延迟

参数:–delay

可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。

设定超时时间

参数:–timeout

可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。

设定重试超时

参数:–retries

当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

设定随机改变的参数值

参数:–randomize

可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。

利用正则过滤目标网址

参数:–scope

例如:

避免过多的错误请求被屏蔽

参数:–safe-url,–safe-freq

有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。

绕过这个策略有两种方式:

关掉URL参数值编码

参数:–skip-urlencode

根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用–skip-urlencode参数。

每次请求时候执行自定义的python代码

参数:–eval

在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。

例子:

上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。

注入


测试参数

参数:-p,–skip

sqlmap默认测试所有的GET和POST参数,当–level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如: -p “id,user-anget”

当你使用–level的值很大但是有个别参数不想测试的时候可以使用–skip参数。

例如:–skip=”user-angent.referer”

在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*

例如:

sqlmap将会测试value1的位置是否可注入。

指定数据库

参数:–dbms

默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:

指定数据库服务器系统

参数:–os

默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

指定无效的大数字

参数:–invalid-bignum

当你想指定一个报错的数值时,可以使用这个参数,例如默认情况系id=13,sqlmap会变成id=-13来报错,你可以指定比如id=9999999来报错。

只定无效的逻辑

参数:–invalid-logical

原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19。

注入payload

参数:–prefix,–suffix

在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。

例如,代码中是这样调用数据库的:

这时你就需要–prefix和–suffix参数了:

这样执行的SQL语句变成:

修改注入的数据

参数:–tamper

sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,你可以使用–tamper参数对数据做修改来绕过WAF等设备。

下面是一个tamper脚本的格式:

可以查看 tamper/ 目录下的有哪些可用的脚本

例如:

探测


探测等级

参数:–level

共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。

这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。

总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

参数:–risk

共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。

测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。

页面比较

参数:–string,–not-string,–regexp,–code

默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致sqlmap的误判。此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错误页面中不存在(使用–string参数添加字符串,–regexp添加正则),同时用户可以提供一段字符串在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(–not-string添加)。用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,可以添加参数–code=200。

参数:–text-only,–titles

有些时候用户知道真条件下的返回页面与假条件下返回页面是不同位置在哪里可以使用–text-only(HTTP响应体中不同)–titles(HTML的title标签中不同)。

注入技术


测试是否是注入

参数:–technique

这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。

支持的探测方式如下:

设定延迟注入的时间

参数:–time-sec

当使用继续时间的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒。

设定UNION查询字段数

参数:–union-cols

默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当–level为5的时候他会增加测试到50个字段数。设定–union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。

设定UNION查询使用的字符

参数:–union-char

默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用–union-char只定UNION查询的字符。

二阶SQL注入

参数:–second-order

有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。–second-order后面跟一个判断页面的URL地址。

列数据


标志

参数:-b,–banner

大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。

用户

参数:-current-user

在大多数据库中可以获取到管理数据的用户。

当前数据库

参数:–current-db

返还当前连接的数据库。

当前用户是否为管理用

参数:–is-dba

判断当前的用户是否为管理,是的话会返回True。

列数据库管理用户

参数:–users

当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

列出并破解数据库用户的hash

参数:–passwords

当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

例子:

可以看到sqlmap不仅勒出数据库的用户跟密码,同时也识别出是PostgreSQL数据库,并询问用户是否采用字典爆破的方式进行破解,这个爆破已经支持Oracle和Microsoft SQL Server。

也可以提供-U参数来指定爆破哪个用户的hash。

列出数据库管理员权限

参数:–privileges

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。

列出数据库管理员角色

参数:–roles

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。

仅适用于当前数据库是Oracle的时候。

列出数据库系统的数据库

参数:–dbs

当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

列举数据库表

参数:–tables,–exclude-sysdbs,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。

如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。

–exclude-sysdbs参数是指包含了所有的系统数据库。

需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

列举数据库表中的字段

参数:–columns,-C,-T,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。

如果没有使用-D参数指定数据库时,默认会使用当前数据库。

列举一个SQLite的例子:

列举数据库系统的架构

参数:–schema,–exclude-sysdbs

用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。

加上–exclude-sysdbs参数,将不会获取数据库自带的系统库内容。

MySQL例子:

获取表中数据个数

参数:–count

有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。

列举一个Microsoft SQL Server例子:

获取整个表的数据

参数:–dump,-C,-T,-D,–start,–stop,–first,–last

如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。

使用-D,-T参数指定想要获取哪个库的哪个表,不适用-D参数时,默认使用当前库。

列举一个Firebird的例子:

可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)。

也可以用-dump跟-C获取指定的字段内容。

sqlmap为每个表生成了一个CSV文件。

如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可hi使用–stop 1,如果想获取第二段与第三段数据,使用参数 –start 1 –stop 3。

也可以用–first与–last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first 3 –last 5,只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。

获取所有数据库表的内容

参数:–dump-all,–exclude-sysdbs

使用–dump-all参数获取所有数据库表的内容,可同时加上–exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它。

搜索字段,表,数据库

参数:–search,-C,-T,-D

–search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。

可以在一下三种情况下使用:

运行自定义的SQL语句

参数:–sql-query,–sql-shell

sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。

如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。

列举一个Mircrosoft SQL Server 2000的例子:

爆破


暴力破解表名

参数:–common-tables

当使用–tables无法获取到数据库的表时,可以使用此参数。

通常是如下情况:

暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。

列举一个MySQL 4.1的例子:

暴力破解列名

参数:–common-columns

与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。

用户自定义函数注入


参数:–udf-inject,–shared-lib

你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问你一些问题,上传到服务器数据库自定义函数,然后根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们。

系统文件操作


从数据库服务器中读取文件

参数:–file-read

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。

列举一个Microsoft SQL Server 2005的例子:

把文件上传到数据库服务器中

参数:–file-write,–file-dest

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。

列举一个MySQL的例子:

运行任意操作系统命令

参数:–os-cmd,–os-shell

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。

在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。

那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。

列举一个PostgreSQL的例子:

用–os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。

当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE写进可写目录,来创建一个web后门。支持的语言:

Meterpreter配合使用

参数:–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数,可以在数据库与攻击者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,并有四种方式执行它:

列举一个MySQL例子:

默认情况下MySQL在Windows上以SYSTEM权限运行,PostgreSQL在Windows与Linux中是低权限运行,Microsoft SQL Server 2000默认是以SYSTEM权限运行,Microsoft SQL Server 2005与2008大部分是以NETWORK SERVICE有时是LOCAL SERVICE。

php Curl post json数据

通常我们用curl post或者get 直接请求
有时也会用到 发送json数据的时候
这里给下代码

mariadb怎么修改存储目录呢?

mariadb默认的数据文档存储目录为/var/lib/mysql,要想将默认创建目录改成/data,需要一下操作:
1、创建/data目录
mkdir /data
chmod 777 /data(要给这个目录至少要附加读写权限)

2、把mariadb服务停掉:
systemctl stop mariadb.service

3、把/var/lib/mysql整个目录复制到/data
cp -r /var/lib/mysql/* /data/
这样就把MySQL的数据文档复制到了/data下

4、编辑mariadb的配置文档/etc/my.cnf

在[client]下添加:
把原来的socket=/var/lib/mysql/mysql.sock,前边加#注释掉,添加socket=/data/mysql.sock(以防有问题再改回来)。
在[mysqld]下添加:
把原来的socket=/var/lib/mysql/mysql.sock,前边加#注释掉,添加socket=/data/mysql.sock(以防有问题再改回来)。

datadir =/datal   (这行没有,需要自己加上)

保存后退出。

5、 chown -R mysql:mysql /data/mysql

6、重新启动mariadb服务
systemctl start mariadb.service。

怎么在 Linux中大量屏蔽恶意IP地址

可以加黑名单
iptables -N blacklist
iptables -A blacklist -s 188.143.232.0/24 -j DROP
iptables -A INPUT -j blacklist
iptables -A OUTPUT -j blacklist
iptables -A FORWARD -j blacklist

如果有大量屏蔽恶意IP地址。这时候可以用 IP集。IP集是一个内核特性,它允许多个(独立)IP地址、MAC地址或者甚至是端口号被编码和有效地存储在位图/哈希内核数据结构中。一旦IP集创建之后,你可以创建一条iptables规则来匹配这个集合。

它可以让你用一条iptable规则匹配多个ip地址!你可以用多个IP地址和端口号的方式来构造IP集,并且可以动态地更新规则而没有性能影响。

在Linux中安装IPset工具

为了创建和管理IP集,你需要使用称为ipset的用户空间工具。

要在Debian、Ubuntu或者Linux Mint上安装:

  1. $ sudo aptget install ipset

Fedora或者CentOS/RHEL 7上安装:

  1. $ sudo yum install ipset

使用IPset命令禁止IP

让我通过简单的示例告诉你该如何使用ipset命令。

首先,让我们创建一条新的IP集,名为banthis(名字任意):

  1. $ sudo ipset create banthis hash:net

第二个参数(hash:net)是必须的,代表的是集合的类型。IP集有多个类型。hash:net类型的IP集使用哈希来存储多个CIDR块。如果你想要在一个集合中存储单独的IP地址,你可以使用hash:ip类型。

一旦创建了一个IP集之后,你可以用下面的命令来检查:

  1. $ sudo ipset list

 

这显示了一个可用的IP集合列表,并有包含了集合成员的详细信息。默认上,每个IP集合可以包含65536个元素(这里是CIDR块)。你可以通过追加”maxelem N”选项来增加限制。

  1. $ sudo ipset create banthis hash:net maxelem 1000000

现在让我们来增加IP块到这个集合中:

  1. $ sudo ipset add banthis 1.1.1.1/32
  2. $ sudo ipset add banthis 1.1.2.0/24
  3. $ sudo ipset add banthis 1.1.3.0/24
  4. $ sudo ipset add banthis 1.1.4.10/24

你会看到集合成员已经改变了。

  1. $ sudo ipset list

 

现在是时候去创建一个使用IP集的iptables规则了。这里的关键是使用”-m set –match-set “选项。

现在让我们创建一条让之前那些IP块不能通过80端口访问web服务的iptable规则。可以通过下面的命令:

  1. $ sudo iptables I INPUT m set matchset banthis src p tcp destinationport 80 j DROP

如果你愿意,你可以保存特定的IP集到一个文件中,以后可以从文件中还原:

  1. $ sudo ipset save banthis f banthis.txt
  2. $ sudo ipset destroy banthis
  3. $ sudo ipset restore f banthis.txt

上面的命令中,我使用了destory选项来删除一个已有的IP集来看看我是否可以还原它。

自动IP地址禁用

现在你应该看到了IP集合的强大了。维护IP黑名单是一件繁琐和费时的工作。实际上,有很多免费或者收费的服务可以来帮你完成这个。一个额外的好处是,让我们看看如何自动将IP黑名单加到IP集中。

首先让我们从iblocklist.com得到免费的黑名单,这个网站有不同的免费和收费的名单。免费的版本是P2P格式。

接下来我要使用一个名为iblocklist2ipset的开源Python工具来将P2P格式的黑名单转化成IP集。

首先,你需要安装了pip。

使用的下面命令安装iblocklist2ipset。

  1. $ sudo pip install iblocklist2ipset

在一些发行版如Fedora,你可能需要运行:

  1. $ sudo pythonpip install iblocklist2ipset

现在到iblocklist.com,抓取任何一个P2P列表的URL(比如”level1″列表)。

 

粘帖URL到下面的命令中。

  1. $ iblocklist2ipset generate \
  2. ipset banthis “http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz” \
  3. > banthis.txt

上面的命令运行之后,你会得到一个名为banthis.txt的文件。如果查看它的内容,你会看到像这些:

  1. create banthis hash:net family inet hashsize 131072 maxelem 237302
  2. add banthis 1.2.4.0/24
  3. add banthis 1.2.8.0/24
  4. add banthis 1.9.75.8/32
  5. add banthis 1.9.96.105/32
  6. add banthis 1.9.102.251/32
  7. add banthis 1.9.189.65/32
  8. add banthis 1.16.0.0/14

你可以用下面的ipset命令来加载这个文件:

  1. $ sudo ipset restore f banthis.txt

现在可以查看自动创建的IP集:

  1. $ sudo ipset list banthis

在写这篇文章时候,“level1”类表包含了237,000个屏蔽的IP列表。你可以看到很多IP地址已经加入到IP集中了。

最后,创建一条iptables命令来屏蔽这些坏蛋!

总结

这篇文章中,我描述了你该如何用强大的ipset来屏蔽不想要的IP地址。同时结合了第三方工具iblocklist2ipset,这样你就可以流畅地维护你的IP屏蔽列表了。