windows下sqli-labs的搭建及学习(GET篇):

http://blog.csdn.net/sherlock17/article/details/64454449

Less-11:基于错误的_post_单引号_字符型注入

post型的注入一般都是登录绕过,测试的方法与get都类似,通过查看源码我们知道以post方式传递的两个参数是uname和passwd,那么首先来尝试下单引号

从这里的报错中可以知道后台的sql语句应该是select username,password from table where username='$_GET['uname']' and password='$_GET['passwd']' limit 0,1

而这里之所以报错是因为加号没有被转义,可以换成--%20来注释后面的limit,然后我们可以构造永真语句绕过登录

接着猜字段数

再试试3,报错,说明用select查询的是两个字段

于是 用union来爆数据库名

依次爆表名,字段

最后的payload:

这里还有一个需要注意的地方,username和password的输入框都可以作为注入点,但是在前一个参数处注入时只能注释掉后面的语句,而在最后一个参数处注入时既可以注释也可以闭合,闭合即uname=&passwd='
or
1='1,后一个1前的单引号会与limit前的单引号匹配(闭合)可以正常执行,之所以username那里不能使用闭合,是因为一旦使用后语句将变成:

select username,password from table where username='$_GET['uname']' or 1=1 and password='$_GET['passwd']' limit 0,1

这里的and运算符优先级比or高,语句会先执行1=1 and
password='$_GET['passwd']',因为我们并不知道正确的password值,故该语句必为flase,且username的值也是flase,两者进行or运算,其结果也必然是flase

Less-12:基于错误的_双引号_post_字符型_变形注入

尝试单引号没反应,再试试双引号

绕过登录:

方法同之前一样,payload:

Less-13:单引号_post_字符型_双注入_变形注入

尝试之前的方法,可以登入但没有返回用户信息

从源码中可以看到,输出被注释了

于是尝试双注入,直接上payload:

Less-14:双引号_post_字符型_双注入_变形注入

把less-13改成双引号就行了

Less-15:单引号_post_bool型/时间型盲注

输入单引号和双引号出错但都没显示报错,加入永真式单引号可以登入,但也没有用户信息

尝试双注入,仍然没有用户信息返回

查看源码发现,他将输出和sql报错都注释了,less-13仅注释了输出所以可以用双注入

这里只能考虑盲注了,因为合法输入和非法输入返回的是不同的页面,所以这里可以用bool盲注,盲注通常都是先确定数据库名,表名,字段名的长度,然后再匹配内容,如下测试数据库名的长度

由此可以确定数据库名的长度是8,接着来匹配名字的8位字母

于是可以确定数据库名的第一个字母是's',按照这个方法逐个去匹配,最好的方式还是写个脚本,省时省力

Less-16:双引号_post_bool型/时间型盲注

输入uname=&passwd=") or 1=1%23显示登入,其余的和less-15没有什么不同,但也可以用来练下时间型盲注,可以构造如下两种:

uname=&passwd=") or (ascii(substr((select database()) ,1,1))) >115 or if(1=1, sleep(5), null)%23

uname=&passwd=") or if(ascii(substr((select database()) ,1,1))>115,1,sleep(5))%23

Less-17:基于错误的_post_更新查询注入

单双引号尝试后,他的画风始终是这样子的

注意到他的提示password reset,估计后台会用到update,于是去翻了下源码,果然

他的大概执行过程是接收到username和password后,首先根据username的值查询数据库返回username和password,然后再将原有的password值用接收到的值替换掉,这里有一个问题是,username在接收时用了一个自定义的过滤函数check_input(),这个函数首先做了判空处理,合法就截取username的前15个字符,然后是通过get_magic_quotes_gpc()的返回值判断magic_quotes_gpc的值是on还是off:

magic_quotes_gpc=on时, 不用对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

magic_quotes_gpc=off
时,必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
     最后,他用了ctype_digit()判断username值的类型是否是数字,是字符就用mysql_real_escape_string对特殊字符进行转义

显然,username这里并不好注入,只有通过弱口令爆破,像是admin之类的,但是他对password的接收没有做过滤的处理,于是我们可以在这里动手脚

对于update的注入有几种思路,我们将他连同insert和delete一起来总结一下:

     1、子查询注入

子查询注入原理即双注入,对于dateup、delete和insert通常都是结合or的逻辑判断,本题为例我们对update可以构造如下语句

获取数据库名:

获取表名:

获取字段名:

获取用户信息;

这里就 直接放insert和delete的后台语句了,利用原理和构造的语句与update都是一样的:

  1. INSERT INTO users (username, password) VALUES ('admin',' or (SELECT 1 FROM(SELECT count(*),concat((SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e) FROM information_schema.tables),floor(rand()*2))x FROM information_schema.tables group by x)a)%23);
  1. DELETE FROM users WHERE id=1 or (SELECT 1 FROM(SELECT count(*),concat((SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e) FROM information_schema.tables),floor(rand()*2))x FROM information_schema.tables group by x)a)%23;

2、通过name_const():

name_const(name,value):返回给定值,当用来产生一个结果集合列时, name_const()促使该列使用给定名称

但他的使用范围受限,只适用于一些数据库版本高于5.0.12,但又稍旧的版本,像现在的5.7版本就不用想了...然而我用的就是较新的版本,注入只能显示数据库的版本信息,想要查询其他的信息,会显示Incorrect
arguments to NAME_CONST,所以,这里我就不截图了,直接放payload:

获取数据库:

  1. ' or (SELECT * FROM (SELECT(name_const(database(),1)),name_const(database(),1))a) where username='admin'%23

获取表名:

  1. ' or (SELECT * FROM(SELECT name_const((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='security'),1),name_const(( SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='security'),1))a)%23

总的来说,对于update,insert和delete都有一个固定的结构:... or (select * from(select
name_const((select ...),1),name_const((select...),1))a) ...

     3、通过updatexml():

updatexml(xml_target,xpath_expr,new_xml)函数是MYSQL对XML文档数据进行查询和修改的XPATH函数,xml_target是目标xml,形式类似于节点目录,xpath_expr是xml的表达式,new_xml是用来替换的xml,简单来说就是,用new_xml把xml_target中包含xpath_expr的部分节点(包括xml_target)替换掉,比如,updatexml(<a><b><c>asd</c></b><e></e></a>,'//b',<f>abc</f>)运行结果是<a><f>abc</f><e></e></a>,其中'//b'的斜杠表示不管b节点在哪一层都替换掉,而'/b'则是指在根目录下替换,此处xml_target的根目录节点是a

利用updatexml()获取数据的固定payload是:... or
updatexml(1,concat(0x7e,(...)),0)
....updatexml()的xml_target和new_xml参数随便设定一个数就行,这里主要让他报错

首先获取数据库名

获取表名:

获取字段名

获取用户信息

报错了,百度一下,说是不能先select出同一表中的某些值,再update这个表(在同一语句中),也就是说将select出的结果再通过中间表select一遍,这样就规避了错误,其实之前在子查询注入中也有用到此方法,同时,还要给多加的一重select赋一个别名

注意,这个问题只出现于mysql,mssql和Oracle不会出现此问

最后总结一下payload:or updatexml(1,concat(0x7e,(select * from(select ....)a),0x7e),0)%23

     4、通过extractvalue():

extractvalue(xml,xpath)函数也是MYSQL5.1以后推出的对XML文档数据进行查询和修改的XPATH函数,可一次获取多个xml中某节点的值,注入时第一个参数随便给一个数字

直接上payload:

payload:or extractvalue(1,concat(0x7e,(select * from(select ....)a),0x7e))%23

Less-18:基于错误的_post_用户代理_头部注入

看标题就知道,这道题主要是通过修改User Agent获取他的报错信息,之前直接改password的方法肯定是不行了,从源码可以看出来password和username都进行了过滤

修改User Agent常用的工具有burp,Live Http Headers,Modify Headers,后两者都是firefox的插件,其中Live Http Headers貌似因为firefox版本的更新,变得不好用了,尤其是对post数据包的重放,但是也有办法修复,这里贴一个修复的方法:http://www.cnblogs.com/lcamry/p/5532122.html

我下面使用的是Modify Headers,首先结合之前的updatexml报错方法修改他的User-Agent

然后刷新less-18的页面就可以看到爆出的数据库名了


     接着用同样的方法爆出表名、字段名、用户信息,但我这里出现了报错暂时还没解决,所以采用别的方法,既然这里构成了逻辑判断,那么就可以用盲注,写个忙盲注脚本就行

Less-19:基于报错的_post_referer_头部注入

登陆后发现他直接给出了提示:“Your referer is:”

于是用和之前相同的方法修改referer:

然后爆表名:

最后的payload:

Less-20:基于报错的_post_cookie_头部注入

换个地方继续注,直接上payload:

Less-21:基于错误的_复杂型_字符串_cookie注入

登录成功后,发现一个奇怪的地方,我登录的账号是admin,但是显示的cookie不是admin,于是去翻了下源码

原来是对cookie中的username做了base64加密,把页面上显示的cookie值拿去解密确实是admin

那么修改cookie的时候就可以把语句先做一次base64的加密,然后再赋给uname,这样就可以突破了,直接上最后的payload:') union select 1,group_concat(username),group_concat(password) from users#

Less-22:基于错误的_post_双引号_字符型_cookie注入

这个和Less-21差别不大,只是')改成"就可以了,下面直接上payload:" union select 1,group_concat(username),group_concat(password) from users#

参考文献:
http://blog.csdn.net/ysynhtt/article/details/45115849
http://blog.csdn.net/priestmoon/article/details/8016121

windows下sqli-labs的搭建及学习(POST篇)的更多相关文章

  1. Windows下visual studio code搭建golang开发环境

    Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...

  2. Windows下SVN服务器的搭建步骤

    1.下载svn服务端和客户端 服务端VISUALSVN SERVER:https://www.visualsvn.com/ 客户端TortoiseSVN:https://tortoisesvn.net ...

  3. windows 下使用 Filezilla server 搭建 ftp 服务器

    windows 下使用 Filezilla server 搭建 ftp 服务器 1. Filezilla server 免费,开源, ftp 服务端 2. 下载安装, windows  https:/ ...

  4. 在Windows下使用Hexo+GithubPage搭建博客的过程

    1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git ...

  5. Windows下Python环境的搭建

    我刚开始接触Python没多久,当然这也是为初学者来更好的去入门Python,我电脑上既跑着Windows也跑着Red Hat的Linux,相比较而言,开发我还是更青睐于Linux系统,很多开发工具红 ...

  6. [转]CUDA在Windows下的软件开发环境搭建

    引自:http://www.makaidong.com/yaoyuanzhi/archive/2010/11/13/1876215.html 本文我们以visual studio 2005 为例演示c ...

  7. Windows下UEFI环境的搭建

    Windows下UEFI环境的搭建 一.环境准备 1. 安装2012及以上VS https://visualstudio.microsoft.com/ 2.下载NASM 2.13.03  http:/ ...

  8. Windows下通过GitHub+Hexo搭建个人博客的步骤

    Windows下通过GitHub+Hexo搭建个人博客的步骤  https://blog.csdn.net/namechenfl/article/details/90442312 https://bl ...

  9. windows下Nacos集群搭建与nginx集成

    前言: nacos集群至少需要三个(一般为奇数个)nacos实 例,其前面顶nginx,外界入口从nginx入 一.windows下Nacos集群搭建 将Nacos的解压包复制分成3份,分别是: na ...

  10. Windows 下 Ionic 开发环境搭建

    Ionic 介绍 首先,Ionic 是什么. Ionic 是一款基于 Cordova 及 Angular 开发 Hybrid/Web APP 的前端框架,类似的其他框架有:Intel XDK等. 简单 ...

随机推荐

  1. 深度学习(十三) R-CNN Fast RCNN

    object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...

  2. ThreadPoolExecutor 杂记

    When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are ru ...

  3. 《Think Python》第6章学习笔记

    目录 6.1 返回函数值(Return values) 6.2 增量式开发(Incremental development) 6.3 组合(Composition) 6.4 布尔函数(Boolean ...

  4. nodejs记录1——async函数

    其实手动配置babel环境并不难,记录下步骤: 1.首先npm init创建一个nodejs项目 2.全局安装babel-cli处理工具:npm i babel-cli -g 3.cd到项目下安装ba ...

  5. android 使用图片轮播图---banner 使用

    转自:https://github.com/youth5201314/banner 使用步骤 Step 1.依赖banner Gradle dependencies{ compile 'com.you ...

  6. SmartGit破解使用的个人方法

    转自:https://www.cnblogs.com/nn839155963/p/5912788.html SmartGit是收费的,可以30天的试用期,30天试用期过后,smartgit 需要输入序 ...

  7. Docker学习(五): 仓库与数据管理

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  8. [javaSE] GUI(菜单)

    菜单MenuBar Menu  MenuItem 调用Frame对象的setMenuBar()方法,设置菜单,参数:MenuBar对象 import java.awt.FlowLayout; impo ...

  9. 撩课-Java每天5道面试题第22天

    141.Spring AOP是什么? AOP:面向切面编程 AOP技术利用一种称为“横切”的技术, 解剖封装的对象内部, 并将那些影响了多个类的公共行为 封装到一个可重用模块, 这样就能减少系统的重复 ...

  10. 分布式微服务技术之 Spring Cloud Netflix

    1 背景 Netflix 是全球十大视频网站中唯一收费站点,是美国互联网流媒体播放商,由于访问量巨大,转型为云计算公司. 由Netflix公司主持开发了一套代码框架和库Netflix OSS即open ...