zoukankan      html  css  js  c++  java
  • 漏洞重温之sql注入(三)

    漏洞重温之sql注入(三)

    sqli-labs 通关之旅

    Less-11

    进入这一关,首先我们可以看到,页面上多了一个登录框,在不需要我们直接在url里面添加id参数这一点我们发现之后,就知道,这一关的请求方式就从前十关的get变成了post。

    看源码。

    从下面两条代码,也可以证实我们之前的猜测。

    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];
    

    在确认了这里为post型传参之后,我们就不需要关注其他的内容了,只需要观察下面这条代码。

    @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
    

    根据前面几关的经验来判断,虽然请求方式从get变成了post但是我们原则不变,sql注入的目的就是闭合原有的sql语句,然后在后面拼接自己希望系统执行的sql语句,并以此获取我们希望得到的数据就可以了。

    所以,我们可以直接在第一个搜索框插入一个单引号,尝试闭合sql语句。

    可以看到,网页爆错。

    但是同时我们的输入也被清除了,为了方便下面的注入,我们可以点开hackbar post data的选项,在下方的输入框中进行sql注入。

    当然,为了保证键值的正确输入,我们可以先随机提交一下登录请求,使用burp进行抓包,然后将请求包的内容复制下来。

    在我们确认uname的位置存在注入之后,就直接在这里进行后面的注入就可以了。

    构造测试payload:

    uname=1' or 1=1 -- &passwd=1&sumbit=Sumbit
    

    可以看到,网页出现了登录名和密码。

    可能会有些人不理解,所以,接下来我会从代码角度解释一下这条测试语句为什么可以返回这种结果。

    从刚才的源码里,我们可以知道,网站的原本的sql语句应该是下面这样的:

    @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
    

    这里其实是一个登陆的最简易的sql语句,简单点来解读的话,就是系统让数据库从users这个表中查找username和password两个值,并且和我们输入的uname和passwd进行对比。

    如果成功,就会被我们返回之前看到的内容。

    但我们现在不知道用户名和密码到底是什么,所以才有了我们的测试语句,在我们提交之后,原本的sql语句会变成下面的这种情况。

    @$sql="SELECT username, password FROM users WHERE username='1' or 1=1 -- ' and password='$passwd' LIMIT 0,1";
    

    这样应该就很清晰了,首先,我们使用单引号闭合语句原本的单引号,然后在后面构造了一个恒等式。所以,虽然我们输入的1在数据库中找不到内容,但是因为后面的1=1恒成立,并且我们的连接符为or,所以只要有一个条件成立,网站就会返回正确的内容。

    而两个横杠,又注释掉了后面的内容,所以我们只输入了一个1就可以成功的看到访问成功之后才可以看到的内容,而sql万能密码,基本也都使用的这个逻辑。

    当然,既然这条语句成立,我们就可以直接进行爆数据库等操作了。

    使用代码:

    1' order by 3 -- 
    

    来查看网页有几个显示位置。

    可以看到网页的显示位置有两个,所以我们可以利用union进行联合查询。

    构造payload:

    uname=1' and 1=2 union select version(),database() -- &passwd=1&sumbit=Sumbit
    

    剩下的流程就跟第一关没区别,不多说了,当然觉得自己sql注入很弱的话,可以一步一步注出数据,比如我,但是文章里就不浪费篇幅了。

    第十一关,通关。

    Less-12

    第十二关,首先页面可以发现基本跟十一关没区别。

    查看源码。

    关注下面三条代码。

    $uname='"'.$uname.'"';
    $passwd='"'.$passwd.'"'; 
    @$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
    

    从上方三个代码,我们可以看出,语句中的username 和 password两个变量是使用 ("")进行包裹的,所以,如果我们想要闭合原有的sql语句,拼接自己希望执行的语句,就需要利用 ")进行闭合。

    测试payload:

    1") or 1=1 -- &password=1&sumbit=Sumbit
    

    可以看到,第十二关,出了闭合方式跟十一关不同之外,其他的都一样,就不多浪费口舌。

    十二关,通关。

    Less-13

    进入第十三关,发现页面似乎跟前两关并没有区别。

    因为不做fuzz测试,所以我们直接看源码。

    从上面的这些源码里面,首先我们可以从下面这个代码中确认闭合方式。

    @$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";
    

    因为没有别的附加,所以我们可以确认该页面的闭合需要使用 ')。

    随后,我们视线放到if判断语句里面,可以看到,执行成功之后网页返回的代码块里面,本来应该输出login name 和 password的地方被注释掉了。

    这也就是说,跟前两关不同的地方在于,这一次,哪怕我们构造的代码成功了,网页也不会给我们显示。

    说道这里,其实有一点就很熟悉了。

    这跟前面get型注入的时候,盲注跟显注的区别一样了。

    所以,这里我们直接利用盲注的手法进行爆数据的操作。

    构造payload:

    uname=1') or length((database()))>1 -- &passwd=1&sumbit=Sumbit //判断当前数据库字符长度
    

    可以看到,根据我们代码执行成功或者失败,网页会给出不同的返回,通过这点区别,我们可以直接进行布尔型盲注。

    ps:这里要说一下,为什么从十一关开始,我的测试代码的连接符从 and 变成了or

    首先要明白一点区别,如果我们使用的and 连接符,那么必须要连接的两条语句同时成功,网站才会给我们返回正确的结果,如果使用的是or连接符,那么两条语句只需要一条成立,网站就会返回正确的的结果。

    这里就要明确一点,首先,在我们进行post型注入的时候,我们的注入参数从前十关的id变成了uname。

    id参数,我们可以只是使用12345等等进行尝试,直到网站成功的给我们显示,我们就可以知道自己选择的参数正确了,但是uname,我们在短时间里面根本无法测试出正确的内容。所以,在前面,在我们明知道id参数是正确的时候,我们会使用到and 这个连接符,但在我们明知道id参数不正确,或者在尝试之后发现id参数不正确的时候,就要使用到or连接符,才能进行下面的注入。

    这里的操作跟盲注基本一致,只是注入的参数发生了变化,所以就不多赘述了。

    当然,建议通过sqli-libs学注入的朋友在清楚的情况下也要手动注出数据,动手才能记得更清楚。

    第十三关,通关。

    Less-14

    进入第十四关,因为网页跟前面并没有区别,所以这里我就不放图片了,直接看源码。

    首先,通过下方代码,我们可以看出语句闭合方式。

    $uname='"'.$uname.'"';
    $passwd='"'.$passwd.'"'; 
    @$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";
    

    从这一条,我们可以看出,想要构造闭合,我们需要使用双引号。

    构造测试语句:

    uname=1" or 1=1 -- &passwd=1&sumbit=Sumbit
    

    可以发现,代码执行成功。

    这里,为了查看是否可以爆出数据,我们构造payload:

    uname=1" or length((database()))<1 -- &passwd=1&sumbit=Sumbit
    uname=1" or length((database()))<100 -- &passwd=1&sumbit=Sumbit
    

    因为我们知道当前数据库的名称肯定是大于1小于100的,所以当前面两条测试语句,第一条网页返回失败,第二条返回成功的时候,就证明我们可以注入出我们需要的内容。

    测试完毕,我们可以通过网页登录成功的回显,来进行布尔型的盲注。

    第十四关,通关。

    Less-15

    第十五关的页面跟前面几关并无不同,这里就不放了,直接看源码。

    从下方这个代码:

    @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
    

    我们可以看出,想要闭合这条sql语句,我们需要使用到单引号。

    同时,又从if判断语句下面的代码块中,我们可以看到,登录成功的显示被注释了,所以这里还是应该使用盲注的手法。

    使用下方的测试语句,可以检测该点是否可以得到我们希望的内容。

    uname=1' or length((database()))<1 -- &passwd=1&sumbit=Sumbit
    uname=1' or length((database()))<100 -- &passwd=1&sumbit=Sumbit
    

    测试完毕,具体流程很长,我做过了,就不再这里多赘述,各位可以参考第十三关通关方式。

    第十五关,通关。

    文章未经本人允许,禁止转载。 有技术问题,可加好友讨论。 联系方式:QQ:MjgxMjMxODAzNQ== 微信:bzNycjByLVhpYW9taW5n
  • 相关阅读:
    JavaScript的语法、数据类型、基本算数和逻辑运算操作
    ES6之常用开发知识点:入门(一)
    ES6中map数据结构
    VUE路径问题

    JS简易计算器的实现,以及代码的优化
    格雷编码
    H5网页布局+css代码美化
    jQuery---五角星评分案例
    Ajax工作原理及优缺点
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/13551589.html
Copyright © 2011-2022 走看看