zoukankan      html  css  js  c++  java
  • Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

    mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理。

    concat函数是mysql的字符串连接函数,定义如下:

    先来验证下concat函数的功能: 

    select concat('m','y','s','q','l')  

    验证结果:如定义所示,concat将字符串连接起来了

    如果把SQL语句放在concat中,SQL语句会被执行么?

    select concat((select last_name from users limit 0,1))

    验证结果:concat中的sql语句可以被执行(这点对后面的sql注入非常重要

    select concat(0x7e,(select user()) ,0x7e)

    验证结果:16进制也能被自动转义(0x7e是 ~符号)

    其次是updatexml函数,网上找的关于该函数的介绍:

     函数功能验证:

    select updatexml(0,concat(0x7e,(select user()) ,0x7e)  ,0)

    验证结果:concat执行sql注入语句,再利用updatexml的报错信息返回sql语句执行结果。这里你可能会问,难道不能直接用updatexml执行sql语句么?我试了一下,并不能,原因可能是updatexml第二个参数必须是字符串吧,所以才需要借助返回值为字符串的concat函数。

    接下来是实操:下面是一个网站的登录请求,如果用户名错误,会返回Unknown user,如果密码错误会返回Invalid password.

    尝试输入单引号,返回数据库的报错,并且得知表名为admins,说明存在sql注入:

     先用concat来注入,发现还是返回Unknown user,没有得到其他有用的信息:

    再结合updatexml,在报错信息中返回了数据库用户root@localhost,看到这里,咱们应该更深入的理解了updatexml和concat注入的原理了吧:利用concat执行sql注入语句,再利用updatexml的报错信息将sql语句的执行结果返回

    这里还有一个疑问:用concat+updatexml注入的时候,大家都会加上16进制的连接符(这里是0x7e,用其他16进制符号也可以的),为什么呢?如果不加呢?

    不加的话返回内容可能会被吃掉部分,据说这是updatexml这个函数的特性。。。,如下:

    接下来看下admins表中有哪些字段:

    最后根据id依次查询admins表中的用户名和密码

     

     针对这个登录页面,其实有更好的sql注入方法,那就是万能密码^_^,使用万能密码不需要知道用户名和密码也能登录,如下:

    那updatexml还留着干嘛呢?万能密码登录进去后不一定是admin权限,使用updatexml能拿到更多数据库信息~

    除了select,还可以利用updatexml完成insert,update和delete注入,原理和select相同。如下:

    insert into guestbook(comment_id,comment,name) values (2,'0livia' or updatexml(1,concat(0x7e,(version())),0) or'','Nervo')
    delete from guestbook where comment_id=2 or updatexml(2,concat(0x7e,(database())),0)
    

      

    一点点感悟:

    1. 还是之前说过的:一定要对输入进行过滤,一定要拦截和处理数据库的异常和报错!!!

    2. concat和updatexml的组合方式只是一种思路,对于其他类型的数据库,只要找到与这两个函数功能类似的函数就可以了!

    如需转载,请注明出处,这是对他人劳动成果的尊重~

  • 相关阅读:
    SQL中的max()函数用法
    C#多线程
    C#操作redis
    spring+mybatis 多数据库事务
    实战项目中 :一个业务对多个数据库操作的同步的处理办法(要么都成功,要么都失败)Threadlocal 数据库事务
    redis之数据操作详解
    C# 两个数组取交集/补集 Intersect()
    MySQL创建索引
    MySQL每日执行
    MySQL删除重复数据
  • 原文地址:https://www.cnblogs.com/sallyzhang/p/12054596.html
Copyright © 2011-2022 走看看