/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
substring i stored procedure kun 32 tegn l~
Fra : Leif Neland


Dato : 30-10-08 13:20

I et forsøg på at rydde op i en sqlinjected testdatabase, brugte jeg et
script, der skulle slette alle forekomster af en bestemt streng i
tekstfelter.

Efter noget gymnastik med at lede alle tabeller igennem efter
tekstfelter, der indeholder det inficerede, kommer scriptet frem til dette:

exec ('update ' + @t + ' set ' + @c + ' = replace(substring('+ @c +
',1,4000),''' + @sqlInjectString + ''', '''')')

Der bliver til f.ex.
update tabl set felt = replace(substring(felt,1,4000),'<script>noget
væmmeligt</script>', '')

Men nu er alle felter blevet trunkeret til max 32 tegn.

Hvordan kan det nu være??

Nå, indholdt af databasen er alligevel uaktuelt og skal laves igen, men
det kunne da være rart at have et fungerende script alligevel...

Jeg brugte enterprise manager til at gemme scriptet som en stored
procedure, og køre det.

Leif

 
 
Stig Johansen (30-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 30-10-08 13:48

Leif Neland wrote:

[snip SQL-injection]

Hvis det er dét jeg tror det er, så har jeg ævlet lidt om det her:
<http://w-o-p-r.dk/storm.monitor/SQL.injection/>

--
Med venlig hilsen
Stig Johansen

Leif Neland (30-10-2008)
Kommentar
Fra : Leif Neland


Dato : 30-10-08 14:10

Stig Johansen skrev:
> Leif Neland wrote:
>
> [snip SQL-injection]
>
> Hvis det er dét jeg tror det er, så har jeg ævlet lidt om det her:
> <http://w-o-p-r.dk/storm.monitor/SQL.injection/>
>
Det er det sådan set, og ganske interessant ævl, må man sige

Jeg undrer mig dog stadig hvorfor
update tabl set felt = replace(substring(felt,1,4000),'<script>noget
væmmeligt</script>', '')
trunkerer til 32 tegn.

Jeg brugte substring(felt,1,4000), fordi replace() ikke ville have en
ntext som parameter.

Leif

Stig Johansen (30-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 30-10-08 15:43

Leif Neland wrote:

> Stig Johansen skrev:
>> Hvis det er dét jeg tror det er, så har jeg ævlet lidt om det her:
>> <http://w-o-p-r.dk/storm.monitor/SQL.injection/>
>>
> Det er det sådan set, og ganske interessant ævl, må man sige
>
> Jeg undrer mig dog stadig hvorfor
> update tabl set felt = replace(substring(felt,1,4000),'<script>noget
> væmmeligt</script>', '')
> trunkerer til 32 tegn.

Det er lidt en 'wrap-up' over flere varianter, nogle varianter med 'fejl'.
Men den du skriver dér ligner mere at man (dig(?)) vil fjerne 'lortet'.
Sætningen:
....
update tabl set felt = replace(substring(felt,1,4000),'<script>noget
væmmeligt</script>', ''
....
fjerner første instans af (måske tidligere) <script> injection.

Hvis vi skal dykke ned i hvorfor det bliver truncated til 32 tegn, så må du
levere et datasæt, der beskriver indholdet.

> Jeg brugte substring(felt,1,4000), fordi replace() ikke ville have en
> ntext som parameter.

Jeg er stadig lidt i tvivl om du laver 'forensic analyse' på hvad der er
sket, eller du er ved at udvikle et 'rep kit'.

Men de første varianter at 'kineseren' benyttede hex encoding af utf-16 (aka
ntext).

--
Med venlig hilsen
Stig Johansen

Peter Lykkegaard (30-10-2008)
Kommentar
Fra : Peter Lykkegaard


Dato : 30-10-08 14:14

"Leif Neland" skrev

> I et forsøg på at rydde op i en sqlinjected testdatabase, brugte jeg et
> script, der skulle slette alle forekomster af en bestemt streng i
> tekstfelter.
> Men nu er alle felter blevet trunkeret til max 32 tegn.
>
Hvad mange karakterer kan du gemme i feltet?
Måske er der sket noget ala dette?

Declare @myField nvarchar(20)
Set @myField = 'Noget indhold'

Print 'Before SQL injection'
Select @myField As myField

Set @myField = 'Noget grimt script' + @myField

Print 'After SQL injection'
Select @myField As myField

Print 'After cleanup'
Set @myField = Replace(@myField, 'Noget grimt script', '')
Select @myField As myField

- Peter


Leif Neland (30-10-2008)
Kommentar
Fra : Leif Neland


Dato : 30-10-08 14:23

Peter Lykkegaard skrev:
> "Leif Neland" skrev
>
>> I et forsøg på at rydde op i en sqlinjected testdatabase, brugte jeg
>> et script, der skulle slette alle forekomster af en bestemt streng i
>> tekstfelter.
>> Men nu er alle felter blevet trunkeret til max 32 tegn.
>>
> Hvad mange karakterer kan du gemme i feltet?
> Måske er der sket noget ala dette?
>

Det er sket i alle felter, selvom de var f.ex. nvarchar(50) eller ntext,
der jo er meget lange.

Der er heller ikke defineret en variabel til at holde feltindholdet i
scriptet, scriptet bygger en sql-sætning og udfører den:
- - - - -
DECLARE fixSQLInject_Cursor
CURSOR FOR
select t,c from tmp_tableInfected

OPEN fixSQLInject_Cursor
FETCH NEXT FROM fixSQLInject_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN

exec ('update ' + @t + ' set ' + @c + ' = replace(substring('+ @c
+ ',1,4000),''' + @sqlInjectString + ''', '''')')

FETCH NEXT FROM fixSQLInject_Cursor INTO @T,@C
END CLOSE fixSQLInject_Cursor
DEALLOCATE fixSQLInject_Cursor
- - - - - - - - -
Hvilket f.ex. ville udføre
update tabel set felt = replace(substring(felt,1,4000),'<script>noget
væmmeligt</script>', '')

Leif

Stig Johansen (30-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 30-10-08 15:55

Leif Neland wrote:

Det er ikke voldsomt mange eksempler du smider her, men..

> Der er heller ikke defineret en variabel til at holde feltindholdet i
> scriptet
....[snip]...
> FETCH NEXT FROM fixSQLInject_Cursor INTO @T,@C
jeg vil gætte på, i forhold til det du skriver, at det vil give et par fejl:
'@T not declared'
'@C not declared'
(Du har ikke nogen DECLARE på disse to i dit skriv)

Det er ikke nemt for os andre at vide hvad du sidder med.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177578
Tips : 31968
Nyheder : 719565
Indlæg : 6409072
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste