|
| 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 (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
| |
|
|