渗透学习笔记之php+ mysql注入(二)

1如果权限为root或者比较大的权限,可以尝试跨裤注入,一般适用在站群

2php绕过安全机制

php安全函数 1 有哪些  2 作用 3 注入时的特征 4 可不可以绕过

1. addslashes

addslashes 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。

一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。

PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默认是 on, 实际上所有的 GET、POST 和 COOKIE 数据都用被 addslashes() 了。 不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。 遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

stripslashes为addslashes的unescape函数

 
<?php
$str = addslashes($_GET["id"]);
 $conn=@mysql_connect("localhost",'root','');
 mysql_select_db("injection",$conn);
 $sql="select * from mysql where sqlin='$str' ";
 $query=mysql_query($sql);
 $arr=mysql_fetch_array($query)
 echo &arr;
?>

类似这样的函数绕过就是用宽字节绕过

可以这样构造payload:
id=1%BF%27 and sleep(3) --+
则最终的sql语句:
SELECT * FROM mysql WHERE sqlin='1�\' and sleep(3) -- ' LIMIT 0,1

2. htmlspecialchars

htmlspecialchars把HTML中的几个特殊字符转义成HTML Entity(格式:&xxxx;)形式,包括(&),('),("),(<),(>)五个字符。

& (AND) => &amp;
” (双引号) => &quot; (当ENT_NOQUOTES没有设置的时候)
‘ (单引号) => &#039; (当ENT_QUOTES设置)
< (小于号) => &lt;
> (大于号) => &gt;   

htmlspecialchars可以用来过滤GET

POST,$COOKIE数据,预防XSS。注意htmlspecialchars函数只是把认为有安全隐患的HTML字符进行转义,如果想要把HTML所有可以转义的字符都进行转义的话请使用htmlentities。

htmlspecialchars_decode为htmlspecialchars的decode函数。

HTML实体对照表:http://www.w3school.com.cn/html/html_entities.asp

 

 
<?php
echo htmlspecialchars($string);
echo htmlentities($string);
?>

3. htmlentities

htmlentities把HTML中可以转义的内容转义成HTML Entity。html_entity_decode为htmlentities的decode函数。

4. mysql_real_escape_string

mysql_real_escape_string会 调用MySQL的库函数mysql_real_escape_string,对(\x00), (\n), (\r), (\), (‘), (\x1a)进行转义,即在前面添加反斜杠(),预防SQL注入。注意你不需要在读取数据库数据的时候调用stripslashes来进行 unescape,因为这些反斜杠是在数据库执行SQL的时候添加的,当把数据写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据, 并不会在前面多了反斜杠

但是现在已经不推荐使用mysql_real_escape_string()了,所有新的应用应该使用像PDO一样的函数库执行数据库操作

 

5. strip_tags

 

strip_tags会过滤掉NUL,HTML和PHP的标签,JavaScript,当然你也可以通过设置该函数的第二个参数,让一些特定的标签出现

 

 
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";
 
// 允许 <p> 和 <a>
echo strip_tags($text, '<p><a>');
?>

 

 输出结果

 

 
Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>

 

 

6、safe_mode

 

Removed from PHP, and generates a fatal E_CORE_ERROR level error when enabled.

 

可以通过配置php.ini中的disable_functions函数列表进行限制指定函数

 

7、magic_quotes_gpc

 

此函数在PHP <= 4.2.3默认开,会自动对GPC (Get/Post/Cookie)提交的值中的’, “, 和空格进行转义,PHP5.4中get_magic_quotes_gpc()默认返回false。

 

基本上还是不受影响,先检测状态,然后采用mysql_real_escape_string进行转义处理

一样可以用宽字节注入

 

 

8、register_globals

 

描述:此函数虽然从PHP>>4.2开始默认由on改为off,但是如果程序员开启的话会导致变量覆盖等安全问题,特别是结合文件包含漏洞等。

 

可以结合前面sablog源码中的函数进行改写(采用extract函数).

 

9、session_register

 

已删除(session_unregister()、session_is_registered 删除),采用session认证的时候可以用该函数注册session变量。

 

采用$_SESSION数组进行注册变量。

10、is_numeric()和intval()

判断数据是否为数字型,是就返回true,不是就返回false

可以用编码绕过

11、自己编写的过滤函数

一般用正则过滤

绕过可以用大小写绕过,编码绕过

以上绕过都可以尝试不同提交方式绕过,因为可能程序员疏忽,导致一些提交方式没做过滤,比如,进行cookie注入

手工注入注意闭合单引号’#注释

分析注入时注意抓包分析

看有没有数据传输有就可以测试注入

cookie 注入就把参数放到cookie里进行测试或者测试cookie里的参数

 

posted @ 2017-04-20 11:50  hesakill  阅读(2086)  评论(0编辑  收藏  举报